【问题标题】:Peewee select query with multiple joins and multiple counts具有多个连接和多个计数的 Peewee 选择查询
【发布时间】:2021-11-10 21:11:37
【问题描述】:

我一直在尝试编写一个 peewee 选择查询,它会生成一个包含 2 个计数的表(一个是与彩票相关的奖品数量,一个是与彩票相关的包裹数量),以及Lottery 模型中的字段。

我设法编写了 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']

虽然上面的代码有效,但有没有更简洁的方法来编写这个查询?

【问题讨论】:

    标签: peewee


    【解决方案1】:

    最好的办法是使用子查询。

    # 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)
    

    【讨论】:

    • 啊!非常感谢!
    • 这个sn-p是不断给予的礼物! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多