SQLAlchemy table 与 Sybase 的反射

SQLAlchemy table reflection with Sybase

当我试图在我的 Sybase 数据库中反映所有 table 时

metadata = MetaData()
metadata.reflect(bind=engine)

SQLAlchemy 运行s 以下查询:

SELECT o.name AS name
FROM sysobjects o JOIN sysusers u ON o.uid = u.uid
WHERE u.name = @schema_name
AND o.type = 'U'

然后我尝试打印 metadata.tables 的内容,但没有任何结果。

我已经尝试创建一个单独的 Table 对象并使用 autoload=True 选项,但这会产生 TableDoesNotExist 错误。

accounts = Table('Accounts', metadata, autoload=True, autoload_with=engine)

我查看了这个查询,@schema_name 似乎正在成为我的用户名,而来自 "sysobjects" 的 table 中的 none 似乎有"name" 属性设置为我的用户名。它们都设置为 "dbo",这意味着数据库所有者,因此查询 returns 什么都没有,也没有任何反映。有没有办法强制 SQLAlchemy 使用与 schema_name 不同的东西?

我发现了两个关于 table 使用 Sybase 方言进行反射的问题。这两个问题都是 6 年前提出的,似乎表明 table 不支持 Sybase 的反射。但是,似乎 SQLAlchemy 试图 运行 一个真正的 sybase 反射查询,所以我认为现在不是这种情况。

我通过在 MetaData 对象上设置 schema 参数解决了这个问题。我不得不将它设置为 dbo。您也可以在 reflect 函数中指定它。