如何在SQLAlchemy中进行跨数据库查询联接?

发布于 2021-01-29 17:58:11

我在SQLAlchemy中找不到此简单查询的解决方案示例。SQLAlchemy可以替换T-SQL ETL数据吗?

select a.field1, a.field2, b.field2
    from database1.schema1.table_a as a
    inner join database2.schema1.table_b as b
         on a.fileld1 = b.fileld1

我将此连接用于Windows身份验证:

engine = create_engine(
    "mssql+pyodbc://@{Server}/{database}?driver=SQL+Server?trusted_connection=yes"
)
关注者
0
被浏览
209
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您需要的是多部分架构名称__table_args__如果您使用的是声明式,则可以使用并使用它来执行查询。由于您省略了表或模型定义,因此我将根据您的查询示例生成示例:

    In [8]: class TableA(Base):
       ...:     __tablename__ = 'table_a'
       ...:     __table_args__ = {
       ...:         'schema': 'database1.schema1'
       ...:     }
       ...:     id = Column(Integer, primary_key=True)
       ...:     field1 = Column(Integer)
       ...:     field2 = Column(Integer)
       ...:
    
    In [9]: class TableB(Base):
       ...:     __tablename__ = 'table_b'
       ...:     __table_args__ = {
       ...:         'schema': 'database2.schema1'
       ...:     }
       ...:     id = Column(Integer, primary_key=True)
       ...:     field1 = Column(Integer)
       ...:     field2 = Column(Integer)
       ...:
    
    In [10]: q = session.query(TableA.field1, TableA.field2, TableB.field2).\
        ...:     join(TableB, TableA.field1 == TableB.field1)
    
    In [12]: q.statement.compile(dialect=mssql.dialect())
    Out[12]: <sqlalchemy.dialects.mssql.base.MSSQLCompiler at 0x7fa3886027b8>
    
    In [13]: print(_)
    SELECT database1.schema1.table_a.field1, database1.schema1.table_a.field2, database2.schema1.table_b.field2 
    FROM database1.schema1.table_a JOIN database2.schema1.table_b ON database1.schema1.table_a.field1 = database2.schema1.table_b.field1
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看