我应该从 Oracle 数据库中提取数据。如何找出数据库中定义了哪些模式?当我没有在 Metadata() 的描述中定义任何模式时,我找不到表。感谢您的帮助,
2 回答
默认 Oracle 模式与 Oracle 连接中使用的用户名匹配。如果您没有看到任何表 - 这意味着这些表是在另一个模式中创建的。
看起来你有两个问题:
1)关于Oracle schemas——如何在Oracle中查找schema和tables
2)关于SQLAlchemy反射——如何为表指定Oracle模式
你可以在很多地方找到第一个问题的答案。即这里:https ://stackoverflow.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 模式的方法。
使用MetaData
并将其传递到 SqlAlchemy 实例或引擎的创建中。
或者__table_args__
在定义模型并传入时使用{'schema': 'other_schema' }
http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.MetaData.params.schema
如何在 SQLAlchemy 列/外键混合中指定 PostgreSQL 模式?
但这两者都无助于外键调用。对于那些,您仍然必须other_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))
还有...另外两个相关链接:
https://github.com/mitsuhiko/flask-sqlalchemy/issues/172
如何在 SQLAlchemy 列/外键混合中指定 PostgreSQL 模式?
希望有帮助。