2017-12-01 7 views
0

SQLAlchemyでこの単純なクエリの解決策の例が見つかりませんでした。 SQLAlchemyはT-SQL ETLデータを置き換えることができますか?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 

私は、Windows認証を使用してこの接続を使用する:あなたが必要なもの

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

さまざまな接続ではなく、クロスデータベースジョインを行うことができます。関連する質問はおそらくhttps://stackoverflow.com/questions/46277437/sqlalchemy-map-table-from-mssql-database-with-prefix-namespaces –

+0

私はちょうど1つの接続で1つ以上のデータベースとそのオブジェクトを使用する必要があります。あなたの例では、私とは異なる質問です。とりあえずありがとう! –

+0

SQLAlchemyを使用する理由のリストは、それが箱の中でサポートしていないもののリストと同様に長くなるでしょう。実際に何を試したのか、何を達成しようとしているのかについての質問を明確にしてください。ETLはどのようにあなたの質問に関連していますか?その性質上、SQLAは何かを置き換えるものではありません。 SQLデータベースを使用するためのツールです。 'engine.execute()'のようなメソッドにSQL文字列を渡すことで、単純なクエリを実行することができます。 –

答えて

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 
関連する問題