基于SQLAlchemy的多对多+一对多关联数据查询需求
获取指定医生关联患者的所有Data数据(SQLAlchemy查询方案)
给定医生ID,需获取其关联所有患者的DataModel数据,现有模型中医生与患者为多对多关联,患者与数据为一对多关联。以下是几种可行的查询方案:
方案1:直接从DataModel关联查询(推荐,单SQL高效获取)
通过模型间的关联关系直接过滤,一步获取所有目标数据:
# 写法1:显式关联中间表 target_data = DataModel.query.join(PatModel).join(DocPat).filter(DocPat.doc_id == 1).all() # 写法2:利用模型关系隐式关联 target_data = DataModel.query.filter(DataModel.patient.has(PatModel.doctor.any(id=1))).all()
方案2:通过医生模型关联获取
先定位目标医生,再遍历其关联患者收集数据(适合需要同时处理医生/患者信息的场景):
# 获取目标医生 doc = DocModel.query.get(1) # 批量收集所有患者的Data数据 all_data = [] for pat in doc.patient: all_data.extend(pat.data.all())
若想通过子查询批量获取,可使用:
from sqlalchemy import select # 子查询获取该医生关联的所有患者ID pat_subquery = select(PatModel.id).filter(PatModel.doctor.any(id=1)) # 过滤出对应患者的所有数据 target_data = DataModel.query.filter(DataModel.patient_id.in_(pat_subquery)).all()
注意:模型定义的冗余问题
你的DocPat多对多中间表存在冗余字段,patient_id和对应的pat关系完全多余,正确的中间表只需保留两个外键:
class DocPat(db.Model): __tablename__ = "docs_pats" id = db.Column(db.Integer, primary_key=True) doc_id = db.Column(db.Integer, db.ForeignKey("doc.id"), nullable=False) pat_id = db.Column(db.Integer, db.ForeignKey("pat.id"), nullable=False)
另外建议统一关系属性命名:将DocModel的patient改为patients、PatModel的doctor改为doctors,复数形式更符合语义逻辑。
内容的提问来源于stack exchange,提问作者PatrickHellman
相关产品推荐
相关产品推荐

