Oracle 表未拥有的 SqlAlchemy 反映
Posted
技术标签:
【中文标题】Oracle 表未拥有的 SqlAlchemy 反映【英文标题】:SqlAlchemy Reflection of Oracle Table Not Owned 【发布时间】:2014-10-16 12:40:53 【问题描述】:我正在使用 SQLAlchemy 对 Oracle 数据库运行 SQL 查询。我拥有数据库的读取权限,但我拥有的用户不拥有我正在使用的任何表。
数据库会定期更新,因此我希望使用反射,而不是明确列出元数据。我找到了this question,它描述了一个类似于我遇到的问题。但是,我无法更改表的所有权,也无法以任何方式修改数据库。我只有读取权限。
如果我没有这些表的所有权,有没有办法在 SQLAlchemy 中反映 Oracle 表?
(编辑)
示例代码:
engine = create_engine('ORACLE CONNECTION STRING')
metadata = MetaData()
students = Table('students', metadata, autoload=True, autoload_with=engine)
我收到sqlalchemy.exc.NoSuchTableError: students
的异常
但是,当我运行以下命令时:
results = engine.execute('SELECT * FROM students')
for r in results:
print(r)
我从表中收到了我期望的输出,它是每行所有字段的元组。
因此,我没有尝试反映单个表,而是尝试反映所有表:
metadata.reflect(bind=engine)
print(metadata.tables)
输出为immutabledict()
。
所以本质上它什么都不是。所有这些表都归用户 A 所有,而我以用户 B 的只读身份登录。
【问题讨论】:
如果您对这些表具有读取权限,即使您不拥有它们,反射也应该可以正常工作。我经常使用这样的桌子。具体是什么问题?如果您尝试写入您只有读取权限的数据库,SQLA 将无法帮助您。 我已经用特定代码编辑了我的问题,以显示我想要完成的工作。我是 sqlalchemy 的新手,所以完全有可能我做的不对。感谢您的帮助。 【参考方案1】:如果您指定您的目标schema
(帐户),您可能会更好地反映其他人的表格:
metadata.reflect(bind=engine, schema='userA')
这样,您将反映属于“userA”的所有可读表。不过,我不确定您为什么能够使用 engine.execute
查询学生。
【讨论】:
成功了!将 schema='userA' 添加到总反射和特定于表的反射按预期工作。再次感谢您的帮助。以上是关于Oracle 表未拥有的 SqlAlchemy 反映的主要内容,如果未能解决你的问题,请参考以下文章