python - SQLAlchemy ORM 复杂连接自引用表
问题描述
我正在寻找创建数据库查询的帮助 - 我正在寻找最新版本Implementation
的Base
. 两者都有一个,并且一个Implementation
可以从一个创建。当您创建一个时,它来自. 对 s 的后续增量不会影响,但反之亦然,当更改的实例时,我想创建一个 ORM 查询来获取最新的和与之对应的最新的。Base
version
Implementation
Base
Implementation
inherits the version
Base
Implementation
Base
Base
Implementation
Base
预期回报类似于
>>> 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)。在这种情况下,预期的返回值是对应于4
和13
(此 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()
[]
如果有人能指出我正确的方向,我将不胜感激。我已经为此工作了一段时间,但没有运气,我不知道如何摆脱困境..
解决方案
推荐阅读
- javascript - 触发时如何使语义-ui侧边栏不使页面内容变暗?
- python - 我的神经网络没有学习(负 R_Squared,总是相同的损失,分类输入数据,回归)
- c - 尝试生成有序链表的意外输出
- openssl - openssl:验证签名但忽略到期日期
- graphql - 如何修复内容引用类型的 Gatsby 查询
- c# - 无法与自托管 WCF 服务通信
- reactjs - 在 BackButton 上:尽管 url 已更改,但组件不会更新
- docker-compose - 错误:yaml.parser.ParserError:解析块映射时
- fluentvalidation - 使用 RuleSet 进行 FluentValidation 测试
- c++ - 如何使用 dlmopen 在不同线程中打开多个共享库?