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 反映的主要内容,如果未能解决你的问题,请参考以下文章

sqlalchemy怎么修改表结构

pandas.read_sql_table 生成表未找到错误

sqlalchemy 1.1.10 oracle连接错误

在 SQLAlchemy 中使用 Oracle 服务名称

使用 SQLAlchemy 连接到 Oracle 数据库

使用 SqlAlchemy 执行返回 REF CURSOR 的 Oracle 存储过程