如何在Peewee ORM中使用fn Object

5 投票
1 回答
5068 浏览
提问于 2025-04-18 12:42

我正在使用Python的Peewee ORM来操作一个MySQL数据库。Peewee提供了一个叫“fn”的对象,让你可以对数据库进行某些类型的调用。我想要进行的调用之一是:

Blocks.select(Blocks, fn.Count(Blocks.height))

这里的“Blocks”是我数据库中的一个表,里面有一个名为“height”的列。这个语法直接来自Peewee的文档,也就是

User.select(
User, fn.Count(Tweet.id))

在这里可以找到 http://peewee.readthedocs.org/en/latest/peewee/querying.html。请注意,我在我的Python文件顶部还有以下几行

import peewee
from peewee import *
from peewee import fn

但是当我运行这段代码时,它并没有工作,反而输出了这个

<class '__main__.Blocks'> SELECT t1.`height`, t1.`hash`, t1.`time`, t1.`confirmations`, t1.`size`, t1.`version`, t1.`merkleRoot`, t1.`numTX`, t1.`nonce`, t1.`bits`, t1.`difficulty`, t1.`chainwork`, t1.`previousBlockHash`, t1.`nextBlockHash`, Count(t1.`height`) FROM `blocks` AS t1 []

所以这实际上只是打印出了select查询返回的列名。

我需要写什么样的peewee代码才能返回表中行的数量呢?我有点后悔使用peewee,因为它让本该简单的查询变得难以找到正确的语法。

1 个回答

5

Peewee 是一个数据库操作工具,它在查询数据时是懒惰的,也就是说它不会立即去获取数据,而是等你真正需要的时候才去获取。为了得到查询的结果,你需要把它强制转换成一个列表,或者通过循环来逐个获取结果,比如:

query = User.select(User, fn.Count(Tweet.id).alias('num_tweets'))
for user in query:
    print user.username, user.num_tweets
users = list(query)

撰写回答