2012-10-01 20 views
6

我应该从oracle数据库提取数据。 如何找出数据库中定义了哪个模式? 当我没有在元数据()的描述中定义任何模式时,我找不到任何表。 感谢您的帮助,sqlalchemy oracle scheme

+1

或者我应该先问一下,是否有可能做这样的事情? – user1711699

回答

9

默认的Oracle模式匹配Oracle连接中使用的用户名。 如果您没有看到任何表格 - 则表示这些表格是在另一个模式中创建的。

看起来你这里有两个问题:

1)有关甲骨文公司的模式 - 如何找到模式和表在Oracle中

2)关于SQLAlchemy的思考 - 如何指定的Oracle架构表

你可以在很多地方找到第一个问题的答案。即这里:https://stackoverflow.com/a/2247758/1296661

回答第二个问题: 如果Table类的构造函数与默认用户的模式不同,则该类的构造函数具有指定表模式的模式参数。在这里看到更多 http://docs.sqlalchemy.org/en/rel_0_7/core/schema.html#sqlalchemy.schema.Table

这里是python代码来回答第二个问题。您需要设置数据库连接和表名值,以匹配您的情况:

from sqlalchemy import Table 
from sqlalchemy.ext.declarative import declarative_base 


from sqlalchemy import create_engine 
engine = create_engine('oracle://<user_name>:<password>@<hostname>:1521/<instance name>', echo=True) 
Base = declarative_base() 

reflected_table = Table('<Table name>', 
    Base.metadata, 
    autoload=True, 
    autoload_with=engine, 
    schema='<Schema name other then user_name>') 
print [c.name for c in reflected_table.columns] 

p = engine.execute("SELECT OWNER,count(*) table_count FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE' GROUP BY OWNER"); 

for r in p: 
    print r 

祝使用sqlschema和反射特性 - 这是一个很大的乐趣。你可以在你的程序中定义你的Python程序几乎不需要定义模式信息。

我在生产中使用oracle db这个特性 - 我唯一需要定义的是明确设置外键和主键的表之间的关系。

+0

谢谢你的回答。但据我所知,如果不是数据库管理员,无法从数据库中获取所有模式的列表。 – user1711699

+0

通常不需要管理员来获取oracle中的列表表和模式的权限。这取决于用户帐户拥有什么权限,但通常有这样的权限。尝试运行此查询: SELECT OWNER,count(*)table_count FROM ALL_OBJECTS WHERE OBJECT_TYPE ='TABLE' GROUP BY OWNER; – vvladymyrov

+0

再次感谢您。我怎样才能在SQLAlchemy中做到这一点?我如何查询整个数据库? sqlalchemy中的“all_objects”是什么? – user1711699