【问题标题】:How to do a cross-database-query join in SQLAlchemy?如何在 SQLAlchemy 中进行跨数据库查询连接?
【发布时间】:2018-05-15 10:00:16
【问题描述】:

我在 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"
)

【问题讨论】:

  • 它可以进行跨数据库连接,只是不能跨各种连接。一个相关的问题可能是stackoverflow.com/questions/46277437/…
  • 我只需要在一个连接中使用多个数据库及其对象。在您的示例中,它与我的问题不同。无论如何,谢谢!
  • 使用 SQLAlchemy 的理由列表会很长,它不支持开箱即用的东西的列表也会很长。您能否澄清您的问题,即您实际尝试了什么以及您甚至想要完成什么等。ETL 与您的问题有什么关系?就其本质而言,SQLA 并不是要取代任何东西。它是使用 SQL 数据库的工具。您可以通过将 SQL 字符串传递给 engine.execute() 等方法来运行您的“简单查询”。
  • 我尝试在与楼上引擎的一次会话中执行此查询,但它不起作用。我认为带有“abstract 类”+“engines.append”的东西可以帮助我,但我找不到很好的例子

标签: python sql-server sqlalchemy


【解决方案1】:

您需要的是multipart schema names。那和使用__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

【讨论】:

    猜你喜欢
    • 2014-07-08
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多