我正在尝试在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
我尝试过:
总是会出现以下错误:
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]
答案 0 :(得分:1)
找到了解决方案,谢谢Ryan Gadsdon和IljaEverilä指出了我的方向。
您需要像这样的表模式参数中精确设置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