如何在ORM查询中进行跨关系关联?根据A模型属性查询C模型数据
基于SQLAlchemy实现跨祖孙模型查询
方法一:为模型添加关联关系(推荐,语法更简洁)
先给三个模型补充relationship属性,让SQLAlchemy自动处理层级关联:
class A(db.Model): __tablename__ = "a" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) # 关联B模型的一对多关系 bs = db.relationship("B", back_populates="a") class B(db.Model): __tablename__ = "b" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) a_id = db.Column(db.Integer, db.ForeignKey("a.id")) # 关联A模型的反向关系 a = db.relationship("A", back_populates="bs") # 关联C模型的一对多关系 cs = db.relationship("C", back_populates="b") class C(db.Model): __tablename__ = "c" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) b_id = db.Column(db.Integer, db.ForeignKey("b.id")) # 关联B模型的反向关系 b = db.relationship("B", back_populates="cs")
添加关系后,就能用类似Django的跨层级语法查询:
# 查询A的name为'a'的所有C数据 result = C.query.filter(C.b.a.name == 'a').all() # 也可以显式JOIN,效果一致 result = C.query.join(C.b).join(B.a).filter(A.name == 'a').all()
方法二:不修改模型,手动JOIN查询
如果不想改动现有模型结构,直接通过外键手动构建关联查询:
# 查询A的name为'a'的所有C数据 result = db.session.query(C)\ .join(B, C.b_id == B.id)\ .join(A, B.a_id == A.id)\ .filter(A.name == 'a')\ .all()
通用查询示例(适配A的任意字段)
比如查询A的id为1的所有C数据:
# 方法一(带关联关系) result = C.query.filter(C.b.a.id == 1).all() # 方法二(手动JOIN) result = db.session.query(C).join(B).join(A).filter(A.id == 1).all()
内容的提问来源于stack exchange,提问作者panchicore
相关产品推荐
相关产品推荐

