Python 使用sqlalchemy连接两个不同的数据库

Python 使用sqlalchemy连接两个不同的数据库,python,sql-server,sqlalchemy,Python,Sql Server,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 我试过: 创建两个引擎,使用autoload生成表并查询它 创建两个引擎打开两个会话并进行子查询 创建两个引擎创建表2的CTE 创建到database1 reflec

我正在尝试连接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
我试过:

  • 创建两个引擎,使用autoload生成表并查询它
  • 创建两个引擎打开两个会话并进行子查询
  • 创建两个引擎创建表2的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和write-down原始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,则可以将该表与连接到同一服务器上任何数据库的任何引擎一起使用


数据库在同一台服务器上吗?是的,它们在同一台服务器上。在这种情况下,名称可能不正确。复制并粘贴完整的表链接。或者您可能还需要澄清服务器,例如(s1.db1.dbo.t1)两个可能重复的@ryangads。不确定我应该在哪里澄清服务器,我有我的代码在回答