如何在ponyorm中创建rowcount?蟒蛇

时间:2015-02-19 13:46:13

标签: python sqlite ponyorm

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

我刚刚在表格中更改了一个属性,我会向我做一个rowcount,他返回1表示TRUE,0表示FALSE。

Ex:只使用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)

1 个答案:

答案 0 :(得分:9)

使用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()

希望我回答你的问题。