首页 > 解决方案 > 如何从 SQLAlchemy 中的子表中过滤数据?

问题描述

我有两个链接表: parent - Apps, child - Versions

Apps中的关系如下所示:

versions = relationship("Versions", uselist=True, back_populates="application")

Versions中的关系如下所示:

application = relationship("Apps", uselist=False, back_populates="versions")

还有更多的领域:

status = Column(Enum(VersionEnum, name='statuses'), nullable=False)
created = Column('created', TIMESTAMP, nullable=False, default=datetime.utcnow)

这是一对多的关系。

我想获得所有应用程序的最新版本。一个应用程序可以有多个版本! 我已经弄清楚并提出了这个查询:

session.query(Apps) \
    .join(Appls.versions) \
    .distinct(ApplicationVersion.application_id) \
    .order_by(ApplicationVersion.application_id, ApplicationVersion.created.desc()) \
    .options(contains_eager(Application.versions))

它工作正常。它返回最新版本的应用程序。

但我也想按状态过滤应用程序。但如果我尝试添加:

session.query(Apps) \
    .join(Appls.versions) \
    .filter_by(Versions.status="UPLOAD")
    .order_by(ApplicationVersion.application_id, ApplicationVersion.created.desc()) \
    .options(contains_eager(Application.versions))

查询无效。它可以工作,但返回的应用程序不是最新版本。

有人可以帮助我并告诉我我做错了什么吗?有没有办法解决这个问题?

现在我用 Python 代码对其进行排序,但这是一个坏主意,因为我有分页问题。所以它必须用 SQLAlchemy 来完成 :)

标签: sqlalchemy

解决方案


推荐阅读