SQLAlchemy/SQL:筛选表,然后连接到查询
在加入之前,我需要过滤一些结果。我有三个模型:ModelA、ModelB和ModelC。ModelA和ModelB都与ModelC有关系,并且都有一个组织id,该id总是需要被过滤掉。ModelB没有组织id(数据在所有组织中共享) 我需要ModelB连接到已经包含ModelA的查询中。联接应仅包括ModelA.organization\u id==ModelB.organization\u id、ModelB.model\u c\u id==ModelA.model\u c\u id且ModelB未过期的项 我的计划是按过期时间和组织id筛选ModelB,然后使用子查询()将筛选结果连接到主查询 我有以下Python代码:SQLAlchemy/SQL:筛选表,然后连接到查询,sql,sqlalchemy,python-3.7,Sql,Sqlalchemy,Python 3.7,在加入之前,我需要过滤一些结果。我有三个模型:ModelA、ModelB和ModelC。ModelA和ModelB都与ModelC有关系,并且都有一个组织id,该id总是需要被过滤掉。ModelB没有组织id(数据在所有组织中共享) 我需要ModelB连接到已经包含ModelA的查询中。联接应仅包括ModelA.organization\u id==ModelB.organization\u id、ModelB.model\u c\u id==ModelA.model\u c\u id且Mode
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语句):
这大概就是我想要的。当我注释掉这段代码时,所有其他代码都经过了很好的测试,工作正常,所以问题似乎出在上面的代码上。有什么问题吗?可能是
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”是请求的组织id的示例。谢谢!昨天,我转到了另一个解决方案,但Inam将其标记为现在已被接受,并将在原始代码中进行进一步测试。非常好。非常感谢。应该有一个没有显式子查询的解决方案。。。。
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)