9

我正在运行 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)

我也尝试过 whereschema='DatabaseA'schema='dbo'. 在所有情况下,SQLAlchemyNoSuchTableError都会为表 A 和 B 抛出一个。有什么想法吗?

4

2 回答 2

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 
于 2016-12-20T19:52:51.850 回答
0

我可以在这里运行这样的测试,反映来自两个远程数据库,并且工作正常。

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

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

  3. 毕竟,metadataA.tables metadataB.tables 中存在什么?

  4. 这里的外壳到底是什么在 SQL 服务器上?(例如表A)。使用这样的区分大小写的名称将导致它被引用。

于 2013-11-02T21:31:57.607 回答