sqlalchemy Oracle 架构

Posted

技术标签:

【中文标题】sqlalchemy Oracle 架构【英文标题】:sqlalchemy Oracle schema 【发布时间】:2012-09-22 06:47:43 【问题描述】:

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

【问题讨论】:

或者我应该先问,有没有可能做这样的事情? 【参考方案1】:

默认 Oracle 架构与 Oracle 连接中使用的用户名匹配。 如果您没有看到任何表 - 这意味着这些表是在另一个架构中创建的。

看来您有两个问题:

1) 关于 Oracle 模式 - 如何在 Oracle 中查找模式和表

2) 关于 SQLAlchemy 反射 - 如何为表指定 Oracle 架构

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

回答第二个问题: 如果表类构造函数与默认用户的模式不同,则表类构造函数具有模式参数来指定表的模式。在这里查看更多 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 的这个特性——我唯一需要定义的是明确设置外键和主键的表之间的关系。

【讨论】:

感谢您的回答。但据我所知,如果不是数据库管理员,就不可能从数据库中获取所有模式的列表。 通常不需要管理员来获得在 oracle 中列出表和模式的权限。这取决于用户帐户有什么权限,但通常有这样的权限。尝试运行以下查询:SELECT OWNER,count(*) table_count FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE' GROUP BY OWNER; 再次感谢您。我怎样才能在 SQLAlchemy 中做到这一点?如何查询整个数据库? sqlalchemy 中“all_objects”的等价物是什么? SQLAlchemy 是“Python SQL 工具包和对象关系映射器,可为应用程序开发人员提供 SQL 的全部功能和灵活性。”它不是 Oracle 管理工具。所以没有任何特殊的方法可以使用 SQLAlchemy 来反映整个数据库——你应该指定模式。但是您可以使用 SQLAlchemy 从我的评论中运行查询。请参阅我的答案中的更新代码。【参考方案2】:

我发现了另外两种设置备用 Oracle 架构的方法。

使用MetaData 并将其传递到SqlAlchemy 实例或引擎的创建中。

或者在定义模型时使用__table_args__ 并传入'schema': 'other_schema'

http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.MetaData.params.schema

How to specify PostgreSQL schema in SQLAlchemy column/foreign key mixin?

但这两种方法都无助于外键调用。对于那些,您仍然需要在表名之前手动添加 other_schema. 前缀。

下面的 sn-p 是在使用 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))

还有...另外两个相关链接:

https://github.com/mitsuhiko/flask-sqlalchemy/issues/172

How to specify PostgreSQL schema in SQLAlchemy column/foreign key mixin?

希望对您有所帮助。

【讨论】:

以上是关于sqlalchemy Oracle 架构的主要内容,如果未能解决你的问题,请参考以下文章

在 Flask-SQLAlchemy 模型上使用函数查询会给出 BaseQuery object is not callable 错误

Flask项目和文档集

一个web应用的诞生

sqlalchemy 1.1.10 oracle连接错误

使用 SQLAlchemy 连接到 Oracle 数据库

Oracle 表未拥有的 SqlAlchemy 反映