1. ホーム
  2. python

[解決済み] SqlAlchemy - リレーションシップ属性によるフィルタリング

2022-08-04 17:42:58

質問

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ステートメントや追加のジョインステートメントを書かずに)関係の属性によってフィルタリングする(直接的な)可能性はありますか?

たとえ簡単な解決策がないとしても、私はすべての答えを得ることに満足しています。

どのように解決するのですか?

使用方法 has() の関係(より読みやすい)を使用します。

patients = Patient.query.filter(Patient.mother.has(phenoscore=10))

またはjoin(通常はより速い)。

patients = Patient.query.join(Patient.mother, aliased=True)\
                    .filter_by(phenoscore=10)