将包含JOIN ON的SQL查询转换为SQLAlchemy
我的查询看起来是这样的('3'和'4'在实际使用中当然会不同):
SELECT op_entries.*, op_entries_status.*
FROM op_entries
LEFT OUTER JOIN op_entries_status ON op_entries.id = op_entries_status.op_id AND op_entries_status.order_id = 3
WHERE op_entries.op_artikel_id = 4 AND op_entries.active
ORDER BY op_entries.id
这个查询是为了获取一个文章或订单组合在生产过程中所有的阶段(操作),以及每个阶段的当前状态(进度),如果有状态记录的话。如果没有状态记录,阶段仍然要返回,但状态的内容会是空的。
我在使用SQLAlchemy时遇到了很大的问题。本来这可以分成两个问题,但我已经在这里找到用普通SQL实现的方法。不过在ORM中就不一样了,我甚至都搞不清楚怎么根据文档来设置JOIN条件!
编辑(新用户不能回答自己的问题):
我想我解决了这个问题,写下来作为问题似乎帮了我!也许这能帮助到其他新手。
query = db.session.query(OpEntries, OpEntriesStatus).\
outerjoin(OpEntriesStatus, db.and_(
OpEntries.id == OpEntriesStatus.op_id,
OpEntriesStatus.order_id == arg_order_id)).\
filter(db.and_(
OpEntries.op_artikel_id == artidQuery,
OpEntries.active)).\
order_by(OpEntries.id).\
all()
我会保持这个问题开放,以防有人有更好的解决方案或任何见解。
1 个回答
15
假设有一些命名规则,下面的代码应该可以实现:
qry = (session.query(OpEntry, OpEntryStatus)
.join(OpEntryStatus, and_(OpEntry.id == OpEntryStatus.op_id, OpEntryStatus.order_id == 3))
.filter(OpEntry.op_artikel_id == 4)
.filter(OpEntry.active == 1)
.order_by(OpEntry.id)
)
想了解更多关于连接(joins)的内容,可以查看join和outerjoin的相关文档。在这些连接中,第二个参数是一个onclause
。如果你需要多个条件,只需使用and_
或or_
来创建你需要的表达式。