使用Sybase的SQLAlchemy表反射

时间:2018-04-17 20:46:39

标签: python sqlalchemy sybase

当我尝试反映Sybase DB中的所有表时

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

SQLAlchemy运行以下查询:

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”的表中似乎没有一个“name”属性设置为我的用户名。它们都设置为“dbo”,这意味着数据库所有者,因此查询不返回任何内容,也没有任何反映。有没有办法强制SQLAlchemy使用不同的schema_name?

我发现了两个关于使用Sybase方言的表反射的问题。两者都在6年前被问过,似乎表明Sybase的表反映不受支持。但是,似乎SQLAlchemy尝试运行如上所述的真正的sybase反射查询,所以我认为现在不是这种情况。

1 个答案:

答案 0 :(得分:0)

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