SQLAlchemy是否可以显式CROSS JOIN?

时间:2013-02-11 13:58:27

标签: python sqlalchemy

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

SELECT * 
FROM foo 
CROSS JOIN bar

如果是,怎么样?

我猜想有类似的东西

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

2 个答案:

答案 0 :(得分:4)

您可以使用内部连接制作笛卡尔积, 应用条件总是如此。 例如。对于SQLAlchemy ORM:

from sqlalchemy.sql.expression import literal

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

现在SQLAlchemy中只有joinouterjoin个函数(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
()