是否可以使用 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)
您可以使用内连接制作笛卡尔积,应用始终为真的条件。例如对于 SQLAlchemy ORM:
from sqlalchemy.sql.expression import literal
session.query(Foo, Bar).join(Bar, literal(True)).all()
Run Code Online (Sandbox Code Playgroud)
SQLAlchemy 中目前只有join和outerjoin函数(v0.9)。
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)