首页 > 解决方案 > SQLAlchemy ORM 复杂连接自引用表

问题描述

我正在寻找创建数据库查询的帮助 - 我正在寻找最新版本ImplementationBase. 两者都有一个,并且一个Implementation可以从一个创建。当您创建一个时,它来自. 对 s 的后续增量不会影响,但反之亦然,当更改的实例时,我想创建一个 ORM 查询来获取最新的和与之对应的最新的。BaseversionImplementationBaseImplementationinherits the versionBaseImplementationBaseBaseImplementationBase

预期回报类似于

>>> results
[ (<Base 4>, <Implementation 5>), ( ... ) ]

即具有最新基础和当前实现的元组列表。

我有一个看起来像这样的表:

+---+------+--------+--------+--------+
| id| type | base_id| version| tracker|
+---+------+--------+--------+--------+
|  1|  base|    null|       1|   uuid |
|  4|  base|    null|       2|   uuid |
|  7|  impl|       1|       1|   uuid |
| 13|  impl|       1|       3|   uuid | 

在这种情况下,这些行使用行中的相同 uuid 绑定tracker。这些实现还有其他辅助数据来唯一标识它们的实现位置。此外,id 为 13 的实现落后于与其对应的基本搜索,因为有一个Base(id 4) 的版本高于implemented.base_id对应的版本(id 为 1 的基本版本为 1)。在这种情况下,预期的返回值是对应于413(此 uuid 大于实现的 base_id 的最新基)和 13(此跟踪器的最新实现)的行/对象

我已经做到了以下几点:

>>> sq1 = db.session.query(Base.id, Base.tracker, func.max(Base.version).label('max')).group_by(Base.tracker, Base.id).subquery("sub1")
>>> sq2 = db.session.query(Implementation, Implementation.base_id, Implemented.tracker).join(sq1, and_(Implementation.tracker == sq1.c.tracker, Base.version == sq1.c.max))
>>> b_alias = aliased(Base)
>>> results = sq.join(b_alias).filter(b_alias.version == sq1.c.max).all()
[]

如果有人能指出我正确的方向,我将不胜感激。我已经为此工作了一段时间,但没有运气,我不知道如何摆脱困境..

标签: pythonormsqlalchemy

解决方案


推荐阅读