【问题标题】:SQLAlchemy: Multiple databases (on the same server) in a single session?SQLAlchemy:单个会话中的多个数据库(在同一台服务器上)?
【发布时间】:2013-10-31 11:35:15
【问题描述】:

我正在运行 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。有什么想法吗?

【问题讨论】:

    标签: sql-server sqlalchemy


    【解决方案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 
    

    【讨论】:

      【解决方案2】:

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

      1. 使用最近的 SQLAlchemy(建议至少 0.8.3)?

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

      3. 在全部反映之后,metadataA.tables metadataB.tables 中存在什么?

      4. 这里的大小写完全正确 SQL 服务器上有什么? (例如表 A)。使用这样区分大小写的名称会导致它被引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-11
        • 2015-12-23
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 2010-09-19
        相关资源
        最近更新 更多