[英]Reflection in SQLAlchemy doesn't work for MS SQL Server system tables?
我正在尝试在 MS SQL Server 数据库中反映系统表:
from sqlalchemy import engine, create_engine, MetaData, Table
meta = MetaData()
url = engine.url.URL(
"mssql+pyodbc",
username=credentials["username"],
password=credentials["pswd"],
host=credentials["host"],
database=credentials["db"],
query=dict(driver="ODBC Driver 13 for SQL Server")
)
e = create_engine(url)
conn = e.connect()
tt = Table("objects", meta, autoload=True, autoload_with=e, schema="sys")
for c in tt.columns:
print(c.name)
最后我得到 NoSuchTable 错误。 我试图反映其他系统表(sys.triggers、sys.sql_modules) - 结果相同。 对于普通表,此代码正常工作,我可以列出列并进行其他查询。 我在我的应用程序中使用的登录具有“db_owner”角色,因此它具有足够的权限,如果我写这样的东西
for item in conn.execute("select * from sys.triggers"):
print(item)
它工作正常。
我究竟做错了什么? 除了执行原始 sql 并将结果包装在数据类等中之外,还有其他方法可以处理来自系统表的数据吗?
我试图在 MS SQL Server 数据库中反映系统视图。 将 echo='debug' 添加到引擎后,我意识到,SQL Alchemy 在 MSSQL 中从 INFORMATION_SCHEMA 搜索表和视图元数据。
INFORMATION_SCHEMA.TABLES 或 INFORMATION_SCHEMA.VIEWS 中未列出系统表和视图。
(我使用的是 SQLAlchemy 1.3.5 版。)
当您将echo='debug'
添加到您的引擎时,您可以看到它在与数据库交谈时所经历的步骤。 在我的例子中,它发出一个查询,由 all_tab_cols 上的 all_col_comments 的左连接组成。 在此查询中,您将看到它使用owner = <schema value>
。
我发现系统表归“SYS”所有,因此通过将架构设置为“SYS”,它将能够很好地找到系统表。 一个小代码示例来阐明在哪里设置架构:
table = db.Table('USER_SOURCE', metadata, schema='SYS', autoload=True, autoload_with=engine)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.