【问题标题】:Convert SQL query with JOIN ON to SQLAlchemy将 JOIN ON 的 SQL 查询转换为 SQLAlchemy
【发布时间】:2013-03-06 12:21:34
【问题描述】:

我的查询看起来像这样(“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 ON 条件!

编辑(新用户不能回答自己的问题):

相信我解决了它,我想把它写下来作为一个问题会有所帮助!也许这会帮助其他一些新手。

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

如果有人有更好的解决方案或任何见解,我会保持开放状态。

【问题讨论】:

    标签: python sql sqlalchemy


    【解决方案1】:

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

    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_ 来创建您需要的任何表达式。

    【讨论】:

    猜你喜欢
    • 2017-07-12
    • 2017-04-25
    • 2019-03-20
    • 2020-05-27
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多