繁体   English   中英

SQLAlchemy 中的反射不适用于 MS SQL Server 系统表?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM