当我尝试反映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反射查询,所以我认为现在不是这种情况。
答案 0 :(得分:0)
我通过在schema
对象上设置MetaData
参数解决了这个问题。我不得不将其设置为dbo
。您也可以在reflect
函数中指定它。