python - 使用 sqlalchemy 加入两个不同的数据库
问题描述
我试图在 MSSQL 中加入 2 个数据库。
这是 SQL 查询:
SELECT od.Indice, cs.Argued
FROM HN_Ondata.dbo.ODCalls as od
JOIN HN_ADMIN.dbo.CallStatus as cs ON od.CallStatusGroup = cs.StatusGroup
我试过了:
- 创建两个引擎,使表具有自动加载并查询它。
- 创建两个引擎,打开两个会话并进行子查询。
- 创建两个引擎创建 table2 的 CTE。
- 创建一个元数据绑定到 database1 reflect table1 然后为 table2 调用 reflect(bind=database2)
总是以这个错误结束:
pymssql.ProgrammingError: (208, b"Invalid object name 'CallStatus'.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n")
我得到的当前解决方案是使用 session.execute 并写下原始 sql,我可以坚持使用它,但我很奇怪有没有办法用 sqlalchemy ORM 做到这一点?
编辑1:
这是我的代码:
db1 = DatabaseManager(settings.DATABASE['hrm'], database='HN_Ondata')
db2 = DatabaseManager(settings.DATABASE['hrm'], database='HN_ADMIN')
metadata1 = MetaData(bind=db1.database)
metadata2 = MetaData(bind=db2.database)
table1 = Table('ODCalls', metadata1, autoload=True)
table2 = Table('CallStatus', metadata2, autoload=True)
with db1.session(raise_err=True) as session:
result = (
session
.query(table1.c.Indice, table2.c.Argued)
.join(table2, table1.c.CallStatusGroup == table2.c.StatusGroup)
.all()
)
谁产生以下查询:
SELECT [ODCalls].[Indice] AS [ODCalls_Indice], [CallStatus].[Argued] AS [CallStatus_Argued]
FROM [ODCalls]
JOIN [CallStatus] ON [ODCalls].[CallStatusGroup] = [CallStatus].[StatusGroup]
解决方案
找到解决方案感谢 Ryan Gadsdon 和 Ilja Everilä 为我指路。
您需要在表架构参数中精确 database.schema,如下所示:
table1 = Table('ODCalls', metadata1, autoload=True, schema='HN_Odcalls.dbo')
仅当表引用您的引擎未连接的数据库时,才需要在模式中指定数据库,如果您在模式参数中精确 database.schema,则可以将该表与连接到同一服务器上任何数据库的任何引擎一起使用。
http://docs.sqlalchemy.org/en/latest/dialects/mssql.html#multipart-schema-names
推荐阅读
- c# - 解析 RDF - dotnetrdf c#
- java - 无法使用 Java maven 4,0 进行 selenium 测试的 Opera 浏览器
- sql - 将数据工厂中的纪元时间转换为日期时间
- java - 无法删除特定的变音符号
- laravel - 尝试使用油门时,Laravel 作业在 Redis 上失败
- r - 如何从数据框中检索特定行并将检索到的值分配给 Rshiny 中的输入控件
- javascript - jQuery - $(this) 不接受元素
- android - 片段中的 Sharedpreference Edittext
- angular - 在角度 6 中禁用 mat-stepper 上先前完成的步骤
- java - Firebase admin java SDK - 在事件发生时获取更改数据而不是所有数据