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

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

不幸的是,我似乎无法使用SQLAlchemy使模拟工作。我已经在几个地方看到了这个话题:
  • Is there a way to perform a join across multiple sessions in sqlalchemy?
  • Cross database join in sqlalchemy
  • How do I connect to multiple databases on the same SQL Server with sqlalchemy?
  • How can I use multiple databases in the same request in Cherrypy and SQLAlchemy?

  • 多数建议使用不同的引擎/ session ,但是我非常需要在数据库之间执行联接,因此我认为这种方法不会有帮助。另一个典型的建议是使用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。有什么想法吗?

    最佳答案

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

    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
    

    关于sql-server - SQLAlchemy:单个 session 中有多个数据库(在同一服务器上)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19520570/

    10-13 08:30
    查看更多