次の例のように、SQLAlchemy を使用して明示的な CROSS JOIN クエリを生成することは可能ですか。
SELECT *
FROM foo
CROSS JOIN bar
はいの場合、どのように?
私はこれに似たものを推測するでしょう
session.query(Foo).crossjoin(Bar).all()
次の例のように、SQLAlchemy を使用して明示的な CROSS JOIN クエリを生成することは可能ですか。
SELECT *
FROM foo
CROSS JOIN bar
はいの場合、どのように?
私はこれに似たものを推測するでしょう
session.query(Foo).crossjoin(Bar).all()
常に真である条件を適用して、内部結合を使用してデカルト積を作成できます。たとえば、SQLAlchemy ORM の場合:
from sqlalchemy.sql.expression import literal
session.query(Foo, Bar).join(Bar, literal(True)).all()
join
今のところ SQLAlchemy にはと関数しかありませんouterjoin
(v0.9)。
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
()