如何在PonyORM中进行行数统计?Python

6

我正在使用这个Python ORM来管理我的应用程序中的数据库:ponyorm.com

我刚刚更改了表中的一个属性,我想让它返回1代表TRUE,0代表FALSE。

例如:只使用sqlite3,我会这样做:

user = conn.execute('SELECT * FROM users')

count = user.rowcount

if count == 1:
    print('Return %d lines' %count)
else:
    print('Bad....return %d lines', %count)

2
你的问题不太清楚。 - ForceBru
你能进一步描述这个问题吗?目前还不清楚你在问什么。 - Games Brainiac
我编辑了我的问题,对此给您带来的不便表示抱歉。 - Marcus Pereira
1个回答

12

通常使用rowcount属性不是计算行数的正确方法。根据SQLite关于rowcount属性的文档,

尽管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()

希望我回答了您的问题。


如果您对答案满意,能否将其接受为正确答案呢?;) - Alexander Kozlovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接