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

zs_*_*ily 5 python sql-server sqlalchemy

我在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
Run Code Online (Sandbox Code Playgroud)

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

engine = create_engine(
    "mssql+pyodbc://@{Server}/{database}?driver=SQL+Server?trusted_connection=yes"
)
Run Code Online (Sandbox Code Playgroud)

Ilj*_*ilä 6

您需要的是多部分模式名称。如果您使用__table_args__声明性 \xe2\x80\x93,则使用 \xe2\x80\x93 将允许您执行查询。由于您省略了表或模型定义,我将根据您的查询示例生成示例:

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