2017-12-01 3 views
0

Ich konnte keine Beispiele für Lösungen für diese einfache Abfrage in SQLAlchemy finden. Kann SQLAlchemy T-SQL-ETL-Daten ersetzen oder nicht?Wie wird eine datenbankübergreifende Abfrage Join in SQLAlchemy?

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 

Ich benutze diese Verbindung mit Windows-Authentifizierung:

engine = create_engine(
    "mssql+pyodbc://@{Server}/{database}?driver=SQL+Server?trusted_connection=yes" 
) 
+0

Es kann eine Cross-Datenbank-Join, nur nicht über verschiedene Verbindungen. Eine verwandte Frage ist vielleicht https://stackoverflow.com/questions/46277437/sqlalchemy-map-table-from-mssql-database-with-prefix-namespaces –

+0

Ich brauche nur mehr als 1 Datenbank und ihre Objekte in einer Verbindung zu verwenden . In Ihrem Beispiel ist es anders als bei mir. Trotzdem danke! –

+0

Eine Liste der Gründe für die Verwendung von SQLAlchemy wäre lang, genauso wie eine Liste von Dingen, die nicht von Anfang an unterstützt werden. Könnten Sie bitte Ihre Frage klären, was Sie tatsächlich versucht haben und was Sie überhaupt erreichen wollen usw. Wie ist ETL in Bezug auf Ihre Frage? Von Natur aus soll SQLA nichts ersetzen. Es ist ein Werkzeug für die Verwendung von SQL-Datenbanken. Sie können Ihre "einfache Abfrage" genau so ausführen, wie sie ist, indem Sie eine SQL-Zeichenfolge an Methoden wie 'engine.execute()' übergeben. –

Antwort

1

Was brauchen Sie ist multipart schema names. Dies und die Verwendung von __table_args__ - falls Sie Declarative verwenden - ermöglicht Ihnen, Ihre Abfrage durchzuführen. Da Sie Ihre Tabellen- oder Modelldefinitionen weggelassen haben, werde ich Beispiele basierend auf dem Beispiel Ihrer Abfrage erstellen:

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 
Verwandte Themen