【发布时间】:2020-11-14 13:57:44
【问题描述】:
我正在尝试创建一个 sqlalchemy 查询 (flask-sqlalchemy),如果所有子项都匹配查询而不是 ANY,则该查询仅返回父对象。浏览器
(Parent
.query
.join(Child)
.filter(Child.column == True)
).all()
将返回所有具有column == True 的子对象的父对象,我如何编写它以使所有子对象都必须具有column == True?
------------------- 更新 --------------- ---------------
以上部分是从这段实际代码中抽象出来的。在哪里
家长 == 学生和孩子 == StudentApplication
模型层次结构如下:
用户 ---> 学生 ---> StudentApplication
我正在尝试检索有学生但申请尚未提交的用户,同时忽略至少有 1 名学生已提交申请的用户。
def _active_student_query(statement=None):
import sqlalchemy as sa
statement = statement or _active_user_query()
statement = statement.join(Student).filter(Student.suspended == sa.false())
return statement
def users_without_submitted_applications(exclude_contacted=False):
import sqlalchemy as sa
from sqlalchemy.orm.util import AliasedClass
# AppAlias = AliasedClass(StudentApplication)
has_any_approved_app = sa.exists(
sa.select([])
.select_from(Student)
.where((StudentApplication.student_id == Student.id) &
(StudentApplication.flags.op('&')(AppFlags.SUBMITTED) > 0),
)
)
statement = _active_student_query()
statement = (statement
# .join(StudentApplication)
# .filter(User.students.any())
# has a student and no submitted applications
.filter(~has_any_approved_app)
# .filter(StudentApplication.flags.op('&')(AppFlags.SUBMITTED) == 0)
)
if exclude_contacted:
statement = (statement
.join(AlertPreferences)
.filter(AlertPreferences.marketing_flags.op('&')(MarketingFlags.NO_APP_PING) == 0)
)
from lib.logger import logger
logger.info(statement.sql)
return statement
这是它生成的 SQL
SELECT users.is_active, users.flags, users.created_on, users.updated_on, users.id
FROM users JOIN student ON users.id = student.user_id
WHERE users.is_active = true AND student.suspended = false AND NOT (EXISTS (SELECT
FROM student_application
WHERE student_application.student_id = student.id AND (student_application.flags & %(flags_1)s) > %(param_1)s))
【问题讨论】:
-
所以您只希望父对象有一个孩子,且该孩子符合您的(一个)条件?
-
@GordThompson 理想情况下,我也希望能够对其应用其他过滤器,但我想过滤掉具有值为 False 的任何孩子的父母
-
啊,好吧。更像
SELECT * FROM parent WHERE ... AND parent.id NOT IN (SELECT child.parent_id FROM child WHERE child.column = False)...? -
@GordThompson 是的,我认为这行得通,我正在玩弄 sqlalchemy
all_函数,试图创建一个有效的子查询。到目前为止没有运气
标签: python flask sqlalchemy flask-sqlalchemy