You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:12:18