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

如何通过标签筛选关联表中的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、3
  • get_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:32:28