我有 2 个表(例如 Student
和 College
)和第三个表,其中包含 student_id
和 college_id
> 外键。
我不想硬删除 Student
和 College
行,因此我在两个表中都包含了 deleted(Boolean)
列.
我想向大学添加一名学生(通过将 student_id
和 college_id
添加到第三个表)。我首先想检查该学生是否已经存在于学院中,并且还想过滤学生和学院的已删除记录。
我写的第一部分:
db.session.query(StudentCollegeMappingModel).filter(
StudentCollegeMappingModel.student_id==student_id,
StudentCollegeMappingModel.college_id==college_id
).first()
但我还想检查一下
Student.deleted==False and College.deleted==False
我该怎么做?
最佳答案
您需要将 Student
和 College
表加入到您的查询中,以便您可以筛选deleted
列:
query = (
StudentCollegeMappingModel.query
.join(Student, Student.id == StudentCollegeMappingModel.student_id)
.join(College, College.id == StudentCollegeMappingModel.college_id)
.filter(
StudentCollegeMappingModel.student_id == student_id,
StudentCollegeMappingModel.college_id == college_id,
Student.deleted.is_(False),
College.deleted.is_(False),
)
)
我使用了StudentCollegeMappingModel.query
而不是db.session.query(StudentCollegeMappingModel)
;它们生成相同的初始 Query 实例,但 Flask-SQLAlchemy 试图通过为您提供 .query 属性来让您更轻松。
您可能可以在此处省略 Student.id == StudentCollegeMappingModel.student_id
和 College.id == StudentCollegeMappingModel.college_id
ON
子句,假设您将 student_id
和 college_id
配置为 ForeignKey()
列,并且表之间没有其他可能会混淆 SQLAlchemy 的关系:
query = (
StudentCollegeMappingModel.query.join(Student).join(College)
.filter(
StudentCollegeMappingModel.student_id == student_id,
StudentCollegeMappingModel.college_id == college_id,
Student.deleted.is_(False),
College.deleted.is_(False),
)
)
您还可以使用from sqlalchemy.sql.expression.false
with ==
:
query = (
StudentCollegeMappingModel.query.join(Student).join(College)
.filter(
StudentCollegeMappingModel.student_id == student_id,
StudentCollegeMappingModel.college_id == college_id,
Student == false(),
College == false(),
)
)
请注意,在插入新记录时,您可以使用上述查询作为 NOT EXISTS
过滤器;这将有助于防止竞争条件(其中多段代码尝试进行相同的更改,或者在测试后但插入之前有些代码设置deleted
列。
关于python - SqlAlchemy : I want to filter query on 2 foreign keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57656613/