【问题标题】:How to make a subquery in sqlalchemy如何在 sqlalchemy 中进行子查询
【发布时间】:2016-12-17 03:53:03
【问题描述】:
SELECT *
FROM Residents
WHERE apartment_id IN (SELECT ID
                       FROM Apartments
                       WHERE postcode = 2000)

我正在使用 sqlalchemy 并尝试执行上述查询。我无法使用db.engine.execute(sql) 将其作为原始 SQL 执行,因为它抱怨我的关系不存在……但我使用以下格式成功查询了我的数据库:session.Query(Residents).filter_by(???)。 不过,我不知道如何使用这种格式构建我想要的查询。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    您可以使用subquery 方法创建子查询

    subquery = session.query(Apartments.id).filter(Apartments.postcode==2000).subquery()
    query = session.query(Residents).filter(Residents.apartment_id.in_(subquery))
    

    【讨论】:

    • 谢谢大人。最后一个不涉及搞乱orm的答案。
    • 查询是 的类型,我无法调用 .all() 来获取结果。你能解释一下如何使用查询对象吗?
    • 查询类型为 。您如何从中获取数据。我可以看到它有 .all() 方法,但是一旦我调用它,flask 就会返回错误,例如:sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column:ointments.done
    • 我不清楚如何使用这种方法将子查询“参数”绑定到主查询(因为子查询是在查询本身之前定义的)。
    【解决方案2】:

    我只是想补充一点,如果您使用此方法更新数据库,请确保添加 synchronize_session='fetch' kwarg。所以它看起来像:

    subquery = session.query(Apartments.id).filter(Apartments.postcode==2000).subquery()
    query = session.query(Residents).\
              filter(Residents.apartment_id.in_(subquery)).\
              update({"key": value}, synchronize_session='fetch')
    

    否则你会遇到问题。

    【讨论】:

    • 什么样的问题,关心扩展?
    • @hjpotter92 您可以在文档中阅读此内容。但一般来说,如果内存中已经有一些 Resident 对象,本次更新也会更新内存中的这些对象。否则,这些对象将过期,从而导致错误。但是,synchronize_session 也很慢,也不好
    猜你喜欢
    • 2011-12-29
    • 2014-05-18
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多