SQLAlchemy/SQL:过滤table,然后加入查询
SQLAlchemy/SQL: Filter table, then join to query
我需要在加入之前过滤掉一些结果。我有三个模型: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 未过期的项目。
我的计划是通过到期和 organization_id 过滤 ModelB,然后使用子查询 () 将过滤后的结果加入主查询。
我有以下 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
这大概就是我想要的。当我注释掉这段代码时,所有其他代码都经过了良好的测试并且可以正常工作,所以问题似乎出在上面的代码上。有什么想法可能是错误的吗?
可能是 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.
我需要在加入之前过滤掉一些结果。我有三个模型: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 未过期的项目。
我的计划是通过到期和 organization_id 过滤 ModelB,然后使用子查询 () 将过滤后的结果加入主查询。
我有以下 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
这大概就是我想要的。当我注释掉这段代码时,所有其他代码都经过了良好的测试并且可以正常工作,所以问题似乎出在上面的代码上。有什么想法可能是错误的吗?
可能是 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.