繁体   English   中英

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

[英]Convert SQL query with JOIN ON to 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中遇到了这个问题。 这本来是一个2部分的问题,但我已经找到了在这里用纯SQL这个的方法。 现在在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()

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

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

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

读取连接,outerjoin以获取有关连接的更多信息,其中第二个参数是onclause 如果您需要更多比1,只是使用and_or_创建你需要的任何表达。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM