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_name
和 amount
当我尝试这个时,我收到一条错误消息说 top 没有名为 amount
的属性
for top in toptx24h:
top.amount # No such attribute amount
我只是想知道如何从 select 查询中访问 amount
和 user_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')])
我有一个 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_name
和 amount
当我尝试这个时,我收到一条错误消息说 top 没有名为 amount
for top in toptx24h:
top.amount # No such attribute amount
我只是想知道如何从 select 查询中访问 amount
和 user_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')])