是否可以使用SQLAlchemy生成显式CROSS JOIN查询,如下例所示:
SELECT *
FROM foo
CROSS JOIN bar
如果是,怎么样?
我猜想有类似的东西
session.query(Foo).crossjoin(Bar).all()
答案 0 :(得分:4)
您可以使用内部连接制作笛卡尔积, 应用条件总是如此。 例如。对于SQLAlchemy ORM:
from sqlalchemy.sql.expression import literal
session.query(Foo, Bar).join(Bar, literal(True)).all()
现在SQLAlchemy中只有join
和outerjoin
个函数(v0.9)。
答案 1 :(得分:2)
SQLAlchemy没有明确的方法来指定CROSS JOIN。 恕我直言,当您在FROM子句中有表时,所有主要关系数据库都会执行CROSS JOIN,但它们之间没有连接条件。
我建议使用SQL Expression API而不是SQLAlchemy ORM API来执行这样的任务 - 因此您将得到结果记录,否则SQLAlchemy ORM API将尝试进行对象映射。对于您的示例,我假设Foo和Bar是映射类:
connection.execute(select[Foo.__table__,Bar.__table__])
请参阅example from the SQLAlchemy manual,了解如何使查询生成笛卡尔积; 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
()