2013-10-22 153 views
8

我正在运行MS SQL Server,并试图在位于不同数据库(位于同一台服务器上)的两个表之间执行JOIN。如果我使用pyodbc连接到服务器(不指定数据库),那么下面的原始SQL工作正常。SQLAlchemy:单个会话中的多个数据库(在同一台服务器上)?

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。任何想法?

回答

0

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

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

  2. 打开“echo ='debug'” - 它发现了什么表?

  3. 之后反映所有,元数据中有什么存在metadata.tables?

  4. 是这里的外壳究竟是什么是SQL服务器? (例如tableA)。使用这样的区分大小写的名称会导致它被引用。

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 
相关问题