3

次の例のように、SQLAlchemy を使用して明示的な CROSS JOIN クエリを生成することは可能ですか。

SELECT * 
FROM foo 
CROSS JOIN bar

はいの場合、どのように?

私はこれに似たものを推測するでしょう

session.query(Foo).crossjoin(Bar).all()
4

2 に答える 2

7

常に真である条件を適用して、内部結合を使用してデカルト積を作成できます。たとえば、SQLAlchemy ORM の場合:

from sqlalchemy.sql.expression import literal

session.query(Foo, Bar).join(Bar, literal(True)).all()

join今のところ SQLAlchemy にはと関数しかありませんouterjoin(v0.9)。

于 2014-04-02T10:29:13.180 に答える
3

SQLAlchemy には、CROSS JOIN を明示的に指定する方法がありません。FROM句にテーブルがあるが、それらの間に結合基準がない場合、IMHOすべての主要なリレーションデータベースはCROSS JOINを実行します。

そのようなタスクには、SQLAlchemy ORM API ではなく SQL Expression API を使用することをお勧めします。そのため、結果のレコードが取得されます。それ以外の場合、SQLAlchemy ORM API はオブジェクト マッピングを実行しようとします。あなたの例では、Foo と Bar がマップされたクラスであると仮定します。

connection.execute(select[Foo.__table__,Bar.__table__])

クエリでデカルト積を生成する方法について説明している SQLAlchemy マニュアルの例を参照してください。users テーブルの各行は、addresses テーブルの各行に対して生成されます。

>>> for row in conn.execute(select([users, addresses])):
...     print row  
SELECT users.id, users.name, users.fullname, addresses.id, addresses.user_id, addresses.email_address
FROM users, addresses
()
于 2013-02-11T14:52:49.193 に答える