sqlalchemy - 如何从 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 来完成 :)
解决方案
推荐阅读
- php - 我正在尝试遍历 PHP 中的 CSV 文件并将返回的数据添加到 mysql 数据库中
- arrays - 业余使用伪代码中的这种数组算法,刚开始学习所以我真的不确定
- c++ - 为什么 C++ 中的 rand() 总是给我相同的数字?
- python - 如何在遍历列表时删除列表中的项目
- java - 在Java中定义一个局部变量:Integer a = 100,“100”存放在哪里?
- node.js - SocketIO + 服务器 + Angular
- sql - 屏蔽策略架构:是否可以跨多个数据库或模式设置屏蔽策略?
- c++ - 创建不带通配符的 gtest 过滤器
- html - 悬停/鼠标悬停html时将视频源更改为图像源
- latex - 如何在 TikZ/er 图片中省略关系的“钻石”符号并控制文本沿关系路径的位置?