SQLAlchemy 是否可以进行显式 CROSS JOIN?

3 python sqlalchemy

是否可以使用 SQLAlchemy 生成显式 CROSS JOIN 查询,如下例所示:

SELECT * 
FROM foo 
CROSS JOIN bar
Run Code Online (Sandbox Code Playgroud)

如果是,如何?

我猜有类似的东西

session.query(Foo).crossjoin(Bar).all()
Run Code Online (Sandbox Code Playgroud)

Ale*_*okk 7

您可以使用内连接制作笛卡尔积,应用始终为真的条件。例如对于 SQLAlchemy ORM:

from sqlalchemy.sql.expression import literal

session.query(Foo, Bar).join(Bar, literal(True)).all()
Run Code Online (Sandbox Code Playgroud)

SQLAlchemy 中目前只有joinouterjoin函数(v0.9)。

  • 请注意,“literal(True)”上的显式连接现在在 SQL Alchemy 1.3 下不起作用(引发请求 ON 子句的错误),尽管 @vvladymyrov 概述的概念仍然有效(本质上是“session.query(Foo,吧).all()`)。 (3认同)

vvl*_*rov 3

SQLAlchemy 没有明确的方法来指定 CROSS JOIN。恕我直言,当 FROM 子句中有表但它们之间没有联接条件时,所有主要关系数据库都会执行 CROSS JOIN。

我建议使用 SQL 表达式 API 而不是 SQLAlchemy ORM API 来执行此类任务 - 这样您将获得结果记录,否则 SQLAlchemy ORM API 将尝试进行对象映射。对于您的示例,我假设 Foo 和 Bar 是映射类:

connection.execute(select[Foo.__table__,Bar.__table__])
Run Code Online (Sandbox Code Playgroud)

请参阅SQLAlchemy 手册中的示例,描述如何使查询生成笛卡尔积;users 表中的每一行都是根据 地址表中的每一行生成的:

>>> 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
()
Run Code Online (Sandbox Code Playgroud)