如何在 SQLAlchemy 中快速查询嵌套关系?

use*_*191 3 python sqlalchemy

我的 SQLAlchemy 数据库中有这些表:

DSource桌子:

class DSource(Base):
    __tablename__ = 'dsource'

    source_id = Column(Integer, primary_key=True)
    subjects= relationship("Subject")
Run Code Online (Sandbox Code Playgroud)

Subject桌子:

class Subject(Base):
    __tablename__ = 'subject'

    subject_id = Column(Integer, primary_key=True)
    source_id=Column(Integer, ForeignKey("dsource.source_id"),nullable=False)
    sequences= relationship("DSequence")
Run Code Online (Sandbox Code Playgroud)

DSequence桌子:

class DSequence(Base):
    __tablename__ = 'dsequence'

    sequence_id = Column(Integer, primary_key=True)
    subject_id = Column(Integer, ForeignKey("subject.subject_id"),nullable=False)
    frames= relationship("Frame")
Run Code Online (Sandbox Code Playgroud)

Frame表:

class Frame(Base):
    __tablename__ = 'frame'

    f_id = Column(Integer, primary_key=True)
    sequence_id=Column(Integer, ForeignKey("dsequence.sequence_id"),nullable=False)
    action_units=Column(String)
    expression=Column(String)
    pts3d=Column(String)
    pts2d=Column(String)
Run Code Online (Sandbox Code Playgroud)

现在我想针对Frame表编写一个查询,为我提供所有带有source_id=2. 一种方法是编写一个嵌套循环来检索所有subjectswith dsource=2,然后为每个主题找到序列,然后为每个序列找到相应的帧。

fr=session.query(Frame,Subject,DSequence,DSource).filter(DSource.source_id==2).all()
Run Code Online (Sandbox Code Playgroud)

但是查询具有这些嵌套关系的数据库确实很慢,因为在Frame表中我有大约 90,000 个帧。有什么方法可以让我查询得更快吗?我不确定是否joinedload可以帮助我解决这个问题。

use*_*191 5

我找到了解决方案,有一种非常简单的方法可以执行上述查询,而且速度非常快:

session.query(Frame).join(DSequence).join(Subject).join(DSource).filter(DSource.source_id==2).all()
Run Code Online (Sandbox Code Playgroud)