Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLAlchemy/SQL:筛选表,然后连接到查询_Sql_Sqlalchemy_Python 3.7 - Fatal编程技术网

SQLAlchemy/SQL:筛选表,然后连接到查询

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

在加入之前,我需要过滤一些结果。我有三个模型: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代码:

        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)