sqlalchemy oracle方案

sqlalchemy oracle方案,oracle,sqlalchemy,Oracle,Sqlalchemy,我应该从oracle数据库中提取数据。 如何找出数据库中定义的架构? 当我在Metadata()的描述中没有定义任何架构时,我找不到任何表。 感谢您的帮助,默认Oracle架构与Oracle连接中使用的用户名匹配。 如果没有看到任何表,则表示这些表是在另一个模式中创建的 看起来您有两个问题: 1) 关于Oracle架构-如何在Oracle中查找架构和表 2) 关于SQLAlchemy反射-如何为表指定Oracle模式 你可以在很多地方找到第一个问题的答案。即在这里: 回答第二个问题: 若表类构造

我应该从oracle数据库中提取数据。 如何找出数据库中定义的架构? 当我在Metadata()的描述中没有定义任何架构时,我找不到任何表。
感谢您的帮助,

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

看起来您有两个问题:

1) 关于Oracle架构-如何在Oracle中查找架构和表

2) 关于SQLAlchemy反射-如何为表指定Oracle模式

你可以在很多地方找到第一个问题的答案。即在这里:

回答第二个问题: 若表类构造函数的模式参数不同于默认用户的模式,则它具有模式参数来指定表的模式。在这里看到更多

下面是回答第二个问题的python代码。您需要设置db connection和table name值以匹配您的案例:

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
来自sqlalchemy导入表的

从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy导入创建引擎
engine=create_engine('oracle://:@:1521/',echo=True)
Base=声明性_Base()
表=表(“”,
Base.metadata,
自动加载=真,
自动加载=发动机,
架构=“”)
打印[表列中c的c.name]
p=engine.execute(“选择所有者,count(*)table_count FROM ALL_OBJECTS,其中OBJECT_TYPE='table'按所有者分组”);
对于p中的r:
印刷机
祝您好运使用sqlschema和反射特性-这很有趣。您的python程序几乎不用在程序中定义模式信息就可以使用现有数据库


我将此功能用于生产中的oracle db—我唯一需要定义的是表之间的关系,显式设置外键和主键。

我找到了另外两种设置备用oracle模式的方法

使用
元数据
并将其传递到SqlAlchemy实例或引擎的创建中

或者在定义模型并传入时使用
\uuuu table\u args\uuuu

但这两种方法对外键调用都没有帮助。对于这些,您仍然必须在表名之前手动添加
other\u schema.

下面的片段是在使用Flask SqlAlchemy的Flask应用程序的上下文中

from sqlalchemy import schema
from flask_sqlalchemy import SQLAlchemy
import os

os.environ['TNS_ADMIN'] = os.path.join( 'oracle_tools', 'network', 'admin')

oracle_connection_string = 'oracle+cx_oracle://{username}:{password}@{tnsname}'.format(
        username='user',
        password='pass',
        tnsname='TNS_SPACE',
    )

oracle_schema = 'user_schema_1'
foreign_key_prefix = oracle_schema + '.'

app.config['SQLALCHEMY_DATABASE_URI'] = oracle_connection_string 


oracle_db_metadata = schema.MetaData(schema=oracle_schema)
db = SQLAlchemy(app, metadata=oracle_db_metadata)

user_groups_table = db.Table(db_table_prefix + 'user_groups', db.Model.metadata,
                             db.Column('...', db.Integer, db.ForeignKey(foreign_key_prefix + 'group.id')),
                             # schema=oracle_schema #  Not necessary because of the use of MetaData above
                             )

class User(db.Model):
    __tablename__ = 'user'
    # __table_args__ = {'schema': oracle_schema } # Not necessary because of the use of MetaData above
    user_name = db.Column('USER_NAME', db.String(250))
而且。。。其他两个相关链接:


希望能有所帮助。

或者我应该先问一下,有没有可能做这样的事情?谢谢你的回答。但据我所知,如果不是数据库管理员,就不可能从数据库中获取所有架构的列表。通常,不需要管理员就可以获得在oracle中列出表和架构的权限。这取决于用户帐户具有什么权限,但通常有这样的权限。尝试运行此查询:从所有对象中选择OWNER,count(*)table_count,其中OBJECT_TYPE='table'按所有者分组;再次感谢你。我怎样才能在炼金术中做到这一点?如何查询整个数据库?sqlalchemy中“所有对象”的等价物是什么?sqlalchemy是“Python SQL toolkit和对象关系映射器,为应用程序开发人员提供SQL的全部功能和灵活性”。它不是Oracle管理工具。所以,并没有任何特殊的方式使用SQLAlchemy来反映整个数据库——您应该指定模式。但是您可以使用SQLAlchemy从我的注释运行查询。请参阅我答案中的更新代码。