Python/Peewee 使用 fn.MAX 查询,别名结果为 "no such attribute"

Python/Peewee query with fn.MAX and alias results in "no such attribute"

我有一个 peewee 查询,如下所示:

toptx24h = Transaction.select(fn.MAX(Transaction.amount).alias('amount'), User.user_name).join(User,on=(User.wallet_address==Transaction.source_address)).where(Transaction.created > past_dt).limit(1)

我的理解是这应该等同于:

select MAX(t.amount) as amount, u.user_name from transaction t inner join user u on u.wallet_address = t.source_address where transaction.created > past_dt limit 1

我的问题是如何访问结果 user_nameamount

当我尝试这个时,我收到一条错误消息说 top 没有名为 amount

的属性
for top in toptx24h:
    top.amount # No such attribute amount

我只是想知道如何从 select 查询中访问 amountuser_name

谢谢

我认为您需要一个 GROUP BY 子句来确保您按 User.username 进行分组。

我写了一些测试代码并确认它可以工作:

    with self.database.atomic():
        charlie = TUser.create(username='charlie')
        huey = TUser.create(username='huey')

        data = (
            (charlie, 10.),
            (charlie, 20.),
            (charlie, 30.),
            (huey, 1.5),
            (huey, 2.5))
        for user, amount in data:
            Transaction.create(user=user, amount=amount)

    amount = fn.MAX(Transaction.amount).alias('amount')
    query = (Transaction
             .select(amount, TUser.username)
             .join(TUser)
             .group_by(TUser.username)
             .order_by(TUser.username))
    with self.assertQueryCount(1):
        data = [(txn.amount, txn.user.username) for txn in query]

    self.assertEqual(data, [
        (30., 'charlie'),
        (2.5, 'huey')])