【问题标题】:SqlAlchemy Reflection of Oracle Table Not OwnedOracle 表未拥有的 SqlAlchemy 反映
【发布时间】: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 的新手,所以完全有可能我做的不对。感谢您的帮助。

标签: python sql oracle sqlalchemy


【解决方案1】:

如果您指定您的目标schema(帐户),您可能会更好地反映其他人的表格:

metadata.reflect(bind=engine, schema='userA')

这样,您将反映属于“userA”的所有可读表。不过,我不确定您为什么能够使用 engine.execute 查询学生。

【讨论】:

  • 成功了!将 schema='userA' 添加到总反射和特定于表的反射按预期工作。再次感谢您的帮助。
猜你喜欢
  • 2015-07-27
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多