SQLAlchemy:单个会话中的多个数据库(在同一台服务器上)?

时间:2013-10-22 14:24:29

标签: sql-server sqlalchemy

我正在运行MS SQL Server,并尝试在位于不同数据库(在同一服务器上)的两个表之间执行JOIN。如果我使用pyodbc连接到服务器(没有指定数据库),那么以下原始SQL工作正常。

SELECT * FROM DatabaseA.dbo.tableA tblA 
         INNER JOIN DatabaseB.dbo.tableB tblB 
         ON tblA.id = tblB.id 

不幸的是,我似乎无法使用SQLAlchemy让模拟工作。我在一些地方看过这个话题:

大多数人建议使用不同的引擎/会话,但我至关重要的是需要在数据库之间执行连接,所以我不认为这种方法会有所帮助。另一个典型的建议是使用schema参数,但这对我来说似乎不起作用。例如,以下内容不起作用。

engine = create_engine('mssql+pyodbc://...')  #Does not specify database

metadataA = MetaData(bind=engine, schema='DatabaseA.dbo', reflect=True)
tableA = Table('tableA', metadataA, autoload=True)

metadataB = MetaData(bind=engine, schema='DatabaseB.dbo', reflect=True)
tableB = Table('tableB', metadataB, autoload=True)

我还尝试了schema='DatabaseA'schema='dbo'的变量。在所有情况下,SQLAlchemy都会为表A和B抛出NoSuchTableError。任何想法?

2 个答案:

答案 0 :(得分:1)

如果您可以在其中一个数据库中创建同义词,则可以将查询保持在该单个数据库的本地。

USE DatabaseB;
GO
CREATE SYNONYM dbo.DbA_TblA FOR DatabaseA.dbo.tableA;
GO

您的查询将变为:

SELECT * FROM dbo.DbA_TblA tblA 
     INNER JOIN dbo.tableB tblB 
     ON tblA.id = tblB.id 

答案 1 :(得分:0)

我可以在这里运行一个测试,从两个远程数据库中反映出来,它运行正常。

  1. 使用最近的SQLAlchemy(至少推荐0.8.3)?

  2. 打开“echo ='debug'” - 它找到了哪些表?

  3. 反映全部后,metadataA.tables metadataB.tables中有什么?

  4. 这里的外壳正是 SQL服务器上的内容是什么? (例如tableA)。使用区分大小写的名称将导致它被引用。