使用rowcount
属性通常不是计算行数的正确方法。根据关于rowcount
属性的 SQLite 文档,
尽管 sqlite3 模块的 Cursor 类实现了这个属性,但数据库引擎自己对确定“受影响的行”/“选定的行”的支持是古怪的。
如果您使用 SQL,获取行数的标准方法是使用COUNT(*)
函数。在 SQLite 中,它可以通过以下方式实现:
cursor = conn.cursor()
cursor.execute('SELECT COUNT(*) FROM users')
rowcount = cursor.fetchone()[0]
使用 PonyORM,您可以通过三种替代方式进行计数。
rowcount = select(u for u in User).count() # approach 1
rowcount = User.select().count() # approach 2
rowcount = count(u for u in User) # approach 3
上面的所有行都应该产生相同的查询。您可以选择对您来说最直观的线条。
如果您不想计算所有行,而只想计算特定行,则可以向查询添加条件。例如,要计算价格大于 100 的产品数量,您可以编写以下任何行:
rowcount = select(p for p in Product if p.price > 100).count() # approach 1
rowcount = Product.select(lambda p: p.price > 100).count() # approach 2
rowcount = count(p for p in Product if p.price > 100) # approach 3
此外,您可能想要计算的不是行数,而是特定列中不同值的数量。例如,不同用户国家的数量。这可以通过以下方式完成:
user_countries_count = select(count(u.country) for u in User).get()
希望我回答了你的问题。