python - SqlAlchemy : I want to filter query on 2 foreign keys

标签 python python-3.x sqlalchemy flask-sqlalchemy

我有 2 个表(例如 StudentCollege)和第三个表,其中包含 student_idcollege_id > 外键。

我不想硬删除 StudentCollege 行,因此我在两个表中都包含了 deleted(Boolean) 列.

我想向大学添加一名学生(通过将 student_idcollege_id 添加到第三个表)。我首先想检查该学生是否已经存在于学院中,并且还想过滤学生和学院的已删除记录。

我写的第一部分:

db.session.query(StudentCollegeMappingModel).filter(
    StudentCollegeMappingModel.student_id==student_id,
    StudentCollegeMappingModel.college_id==college_id
).first()

但我还想检查一下

Student.deleted==False and College.deleted==False

我该怎么做?

最佳答案

您需要将 StudentCollege 表加入到您的查询中,以便您可以筛选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_idCollege.id == StudentCollegeMappingModel.college_id ON 子句,假设您将 student_idcollege_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/

相关文章:

python - 可变移动平均线

python - 在循环中创建实例变量返回 None 对象

python - 连接到动态数据库参数 sqlalchemy

Python SQLAlchemy 获取匹配行和列相同的下一行

python - 是否可以通过多个 TCP 客户端远程使用 Python 的 cmd 模块?

python - 我可以在 Flask-SQLAlchemy 中使用数组枚举列吗?

python - 对象没有被传递到 flask 路由中

python-3.x - 用 Bokeh 为两条曲线之间的区域着色

python - 获取 NumPy 数组中连续命中的数量及其第一个/最后一个索引

python - 如何从 SQL 模型中为连接到它的 QListView 选择行