将带有JOIN的SQL查询转换为SQLAlchemy

2024-09-29 22:04:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我的查询看起来是这样的(“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中运行时遇到了很多问题。这本来是一个由两部分组成的问题,但我找到了方法来做this in plain SQL here already。现在在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()

我会保持开放,以防有人有更好的解决方案或任何见解。


Tags: andiddb状态statusorderquery阶段
1条回答
网友
1楼 · 发布于 2024-09-29 22:04:48

假设有一些命名约定,下面应该这样做:

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)
        )

阅读join, outerjoin了解有关联接的更多信息,其中第二个参数是onclause。如果需要1个以上的表达式,只需使用and_or_来创建所需的任何表达式。

相关问题 更多 >

    热门问题