【问题标题】:SQLAlchemy/SQL: Filter table, then join to querySQLAlchemy/SQL:过滤表,然后加入查询
【发布时间】:2019-12-02 22:19:59
【问题描述】:

我需要在加入之前过滤掉一些结果。我有三个模型:ModelA、ModelB 和 ModelC。 ModelA 和 ModelB 都与 ModelC 有关系,并且它们都有一个 organization_id,它总是需要被过滤掉。 ModelB 没有 organization_id(数据在所有组织之间共享)。

我需要将 ModelB 加入到已经包含 ModelA 的查询中。联接应仅包含 ModelA.organization_id == ModelB.organization_id、ModelB.model_c_id == ModelA.model_c_id 且 ModelB 未过期的项目。

我的计划是通过过期和组织 ID 过滤 ModelB,然后使用 subquery() 将过滤后的结果加入到主查询中。

我有以下 Python 代码:

        query = ModelA.query().filter_by(ModelA.organization_id == organization_id)  # simplified for this post
        sub = ModelB.objects.query()
        sub = sub.filter(
            ModelB.organization_id == organization_id
        )
        sub = ModelB.subquery()
        query = query.join(
            sub, sub.columns.model_c_id == ModelA.model_c_id
        )

这是调试器生成的 SQL(没有大部分 AS 语句):

    SELECT *
    FROM parcels JOIN recipients ON recipients.id = parcels.recipient_id JOIN senders ON senders.id = parcels.sender_id
    JOIN (SELECT *
      FROM recipient_watch_lists 
      WHERE recipient_watch_lists.organization_id = %(organization_id_1)s)
    WHERE recipient_watch_lists.organization_id = %(organization_id_1)s) AS anon_1 ON anon_1.recipient_id = parcels.recipient_id 

这似乎大致是我想要的。当我注释掉这段代码时,所有其他代码都经过充分测试并且工作正常,所以问题似乎出在上面的代码上。有什么想法可能是错的吗?

【问题讨论】:

    标签: sql sqlalchemy python-3.7


    【解决方案1】:

    sub = ModelB.subquery() 可能有问题。该代码导致错误,但逻辑上也是错误的,因为它取消了 org_id 的约束。

    我用sub = sub.subquery() 替换了它,代码对我有用:

    query = ModelA.query.filter(ModelA.org_id == 2)
    sub = ModelB.query.filter(ModelB.org_id == 2)
    sub = sub.subquery()
    query = query.join(sub, sub.columns.id_C == ModelA.id_C)
    

    我还收到了 ModelB.objects 的错误,因此我将您的两行代码合二为一。 “2”是请求的 org_id 的示例。

    【讨论】:

    • 谢谢!我昨天转向另一个解决方案,但 Inam 将其标记为现在已接受,并将在原始代码中进一步测试。
    • 非常好。谢谢你。应该有一个没有显式子查询的解决方案......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    • 2017-06-08
    相关资源
    最近更新 更多