peewee - 具有多个连接和多个计数的 Peewee 选择查询
问题描述
我一直在尝试编写一个 peewee 选择查询,它会生成一个包含 2 个计数的表(一个是与彩票相关的奖品数量,一个是与彩票相关的包裹数量),以及中的字段彩票模型。
我已经设法编写了 1 个计数的选择查询(见下文),然后我不得不将 ModelSelects 转换为列表并手动加入它们(我认为这很 hacky)。
我确实设法编写了一个选择查询,其中加入了结果,但它会将包裹数与奖品数相乘(我已经丢失了该查询)。
我也尝试过使用 .switch(Lottery) 但我没有任何运气。
query1 = (Lottery.select(Lottery,fn.count(Package.id).alias('packages'))
.join(LotteryPackage)
.join(Package)
.order_by(Lottery.id)
.group_by(Lottery)
.dicts())
query2 = (Lottery.select(Lottery.id.alias('lotteryID'), fn.count(Prize.id).alias('prizes'))
.join(LotteryPrize)
.join(Prize)
.group_by(Lottery)
.order_by(Lottery.id)
.dicts())
lottery = list(query1)
query3 = list(query2)
for x in range(len(lottery)):
lottery[x]['prizes'] = query3[x]['prizes']
虽然上面的代码有效,但有没有更简洁的方法来编写这个查询?
解决方案
你最好的办法是用子查询来做到这一点。
# Create query which gets lottery id and count of packages.
L1 = Lottery.alias()
subq1 = (L1
.select(L1.id, fn.COUNT(LotteryPackage.package).alias('packages'))
.join(LotteryPackage, JOIN.LEFT_OUTER)
.group_by(L1.id))
# Create query which gets lottery id and count of prizes.
L2 = Lottery.alias()
subq2 = (L2
.select(L2.id, fn.COUNT(LotteryPrize.prize).alias('prizes'))
.join(LotteryPrize, JOIN.LEFT_OUTER)
.group_by(L2.id))
# Select from lottery, joining on each subquery and returning
# the counts.
query = (Lottery
.select(Lottery, subq1.c.packages, subq2.c.prizes)
.join(subq1, on=(Lottery.id == subq1.c.id))
.join(subq2, on=(Lottery.id == subq2.c.id))
.order_by(Lottery.name))
for row in query.objects():
print(row.name, row.packages, row.prizes)
推荐阅读
- swift - SwiftUI - 显示导航栏导致 ScrollView 跳转
- python - Python 类属性由所有实例共享。如何避免?
- collections - 在 F# 中获取匹配条件的元素的所有索引
- linked-list - 从头开始创建链表和一些方法
- salesforce - getRecord 方法在控制台上引发错误
- postgresql - 如何启动 TimescaleDB 压缩作业?
- javascript - 更新 ag-grid 单元格样式 onCellKeyDown
- java - 如何禁用来自 SimpleJpaRepository 的读取操作的事务行为?
- docker - Gitlab CI - runner - 如何在同一台服务器上配置多个 docker 执行器
- mysql - SQL - 按 ID 选择键 [同一张表]