1

ORM ベースのクエリを実行したいテーブルがあります。

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    is_active = Column(Boolean, server_default="1", nullable=False)
    is_deleted = Column(Boolean, server_default="0", nullable=False)
    created_at = Column(DateTime, nullable = False, default=func.now())
    first_name = Column(String(30), nullable=False)
    surname_name = Column(String(30), nullable=False)

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    is_active = Column(Boolean, server_default="1", nullable=False)
    is_deleted = Column(Boolean, server_default="0", nullable=False)
    created_at = Column(DateTime, nullable = False, default=func.now())
    first_name = Column(String(30), nullable=False)
    surname_name = Column(String(30), nullable=False)
    appointments = relationship("ChildAppointment", backref="child")

class ParentChild(Base):
    '''provides a many to many relationship for parent and child'''
    __tablename__ = 'parent_child'
    id = Column(Integer, primary_key=True)
    is_active = Column(Boolean, nullable=False, server_default="1")
    is_deleted = Column(Boolean, nullable=False, server_default="0")
    parent_id = Column(Integer, ForeignKey('parent.id'), nullable=False)
    child_id = Column(Integer, ForeignKey('child.id'))

    parents = relationship("Parent", backref="parent_child")
    children = relationship("Child", backref="parent_child")

class ChildAppointment(Base):
    __tablename__ = 'child_appointment'
    id = Column(Integer, primary_key=True)
    is_active = Column(Boolean, nullable=False, server_default="1")
    is_deleted = Column(Boolean, nullable=False, server_default="0")
    created_at = Column(DateTime, nullable = False, default=func.now())
    child_id = Column(Integer, ForeignKey('child.id'))
    date_appointment = Column(DateTime, nullable = False)

テーブルにクエリを実行ParentChildし、SQLAlchemy リレーションシップ マジックを使用して、子の最新の予約日を取得したいのですがdate_appointment、子テーブルで並べ替えられた結果が必要です。

ここで@zeekの例に従い、次のことを思いつきました。

for data in session.query(ParentChild).join(Child.appointments).filter(ParentChild.parent_id == 1).\
        order_by(Child.appointments.date_appointment.desc()).all():

ただし、エラーが発生しますattributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object associated with Child.appointments has an attribute 'date_appointment'

私のシナリオは、そのリンクで指定されたものを壊します.4つのテーブルがあるため、私の答えを私のものに合わせることができないため、余分なテーブルが追加されるためです.

ありがとう。

4

1 に答える 1

1

2 つのこと: まず、結合条件については、一種のチェーンとして指定する必要があります。

  • 親子 -> 子
  • 子 -> 子の予定

それは次のように行われます:

session.query(ParentChild).join(ParentChild.children).join(Child.appointments)

これにより、正しい結合が得られます。明確であれば、これもできると思います:

session.query(ParentChild).join(Child).join(ChildAppointment)

しかし、あなたはそれを試してみる必要があります.

ただし、実際のエラーは次の部分から発生します。

Child.appointments.date_appointment

代わりに、次のようになります。

ChildAppointment.date_appointment

上記の sで指定したため、SQLAlchemyはこれChildAppointmentを関連付ける方法を既に知っています。これを生の SQL 用語で考えると、この方法の方がずっと理にかなっています。ChildParentChildjoin

だからあなたの最終的な解決策:

session.query(ParentChild).join(ParentChild.children).join(Child.appointments).filter(ParentChild.parent_id == 1).order_by(ChildAppointment.date_appointment.desc()).all():
于 2013-10-28T22:27:52.567 に答える