SqlAlchemy – 通过关系属性进行过滤
我没有太多的SQLAlchemy的经验和一个问题,我不能解决,但寻找一个尝试了很多的代码。 这是我的类(简化为最重要的代码):
class Patient(Base): __tablename__ = 'patients' id = Column(Integer, primary_key=True, nullable=False) mother_id = Column(Integer, ForeignKey('patients.id'), index=True) mother = relationship('Patient', primaryjoin='Patient.id==Patient.mother_id', remote_side='Patient.id', uselist=False) phenoscore = Column(Float)
我想询问所有的病人,他们的母亲的病史是(例如)== 10
据说,我尝试了很多代码,但我没有得到它。 在我看来,逻辑上的解决办法是
patients = Patient.query.filter(Patient.mother.phenoscore == 10)
因为你可以在输出时访问每个元素的.mother.phenoscore,但是这个代码不会这样做。 是否有(直接的)可能性根据关系的属性进行过滤(无需编写SQL语句或额外的连接语句),我需要多次这样的filter。
即使没有简单的解决办法,我对所有的答案感到高兴
非常感谢克里斯托
使用方法has()
关系(更可读):
patients = Patient.query.filter(Patient.mother.has(phenoscore=10))
或join(通常更快):
patients = Patient.query.join(Patient.mother, aliased=True)\ .filter_by(phenoscore=10)
你必须通过连接来查询关系
你会从这个自我引用查询策略中得到例子
对你来说是一个好消息:我最近制作了一个软件包,可以像Django中的 “神奇”string一样进行过滤/sorting,所以你现在可以写出类似于
Patient.where(mother___phenoscore=10)
这个时间要短得多,特别是对于复杂的滤波器来说,
Comment.where(post___public=True, post___user___name__like='Bi%')
希望你会喜欢这个包
https://github.com/absent1706/sqlalchemy-mixins#django-like-queries
我用会话,但可以直接访问关系字段的替代方法是
db_session.query(Patient).join(Patient.mother) \ .filter(Patient.mother.property.mapper.class_.phenoscore==10)
我没有testing过,但我猜这也可以
Patient.query.join(Patient.mother) \ .filter(Patient.mother.property.mapper.class_.phenoscore==10)