如何通过标签筛选关联表中的Patient记录?
基于Flask-SQLAlchemy查询带特定标签组合的患者
问题背景
现有关联的Flask-SQLAlchemy模型定义如下:
from flask_sqlalchemy import SQLAlchemy import sqlalchemy as sql db = SQLAlchemy() class Patient(db.Model): __tablename__ = "patient" id = db.Column(db.UUID(as_uuid=True), primary_key=True, unique=True, server_default=sql.text("gen_random_uuid()")) name = db.Column(db.String) tags = db.relationship('PatientTag', backref="patient", lazy="dynamic") class PatientTag(db.Model): __tablename__ = "patient_tag" id = db.Column(db.Integer, primary_key=True, autoincrement=True, unique=True) patient_id = db.Column(db.UUID(as_uuid=True), db.ForeignKey(Patient.id)) mainTag = db.Column(db.String) subTag = db.Column(db.String)
对应示例数据:
-- Table Patient id|name -------- 1 |pt a 2 |pt b 3 |pt c -- Table PatientTag patient_id|mainTag|subTag ------------------------- 1 |spine | 1 |spine |degenerative 2 |spine |trauma 3 |spine |trauma
需求:查询带有特定标签组合(如(spine, trauma)或(spine, degenerative))的患者,返回精确匹配该组合的患者列表。
解决方案
方法1:关联查询+去重
通过join关联患者表和标签表,直接筛选符合条件的标签记录,再通过distinct()避免重复返回同一患者(如果患者有多个匹配标签的情况):
def get_patients_by_tag(main_tag, sub_tag): # 查询匹配指定mainTag和subTag的患者 patients = Patient.query.join(Patient.tags).filter( PatientTag.mainTag == main_tag, PatientTag.subTag == sub_tag ).distinct().all() return patients
调用示例:
get_patients_by_tag('spine', 'trauma')返回患者2、3get_patients_by_tag('spine', 'degenerative')返回患者1
方法2:子查询筛选ID集合
先通过子查询获取符合标签条件的患者ID,再用这些ID查询患者表,适合更复杂的过滤场景:
def get_patients_by_tag(main_tag, sub_tag): # 子查询获取匹配标签的患者ID matching_patient_ids = db.session.query(PatientTag.patient_id).filter( PatientTag.mainTag == main_tag, PatientTag.subTag == sub_tag ).subquery() # 根据ID集合查询患者 patients = Patient.query.filter(Patient.id.in_(matching_patient_ids)).all() return patients
特殊情况处理
如果subTag字段允许存储NULL值(而非空字符串),需要将过滤条件改为PatientTag.subTag.is_(sub_tag),因为==无法匹配SQL中的NULL值:
# 适配subTag为NULL的场景 patients = Patient.query.join(Patient.tags).filter( PatientTag.mainTag == main_tag, PatientTag.subTag.is_(sub_tag) ).distinct().all()
内容的提问来源于stack exchange,提问作者Hadi
相关产品推荐
相关产品推荐

