【问题标题】:Get psycopg2 count(*) number of results获取 psycopg2 count(*) 结果数
【发布时间】:2013-10-12 01:46:54
【问题描述】:

获取此查询返回的数字或行的正确方法是什么?我特别想看看是否没有返回结果。

sql = 'SELECT count(*) from table WHERE guid = %s;'
data=[guid]
cur.execute(sql,data)
results = cur.fetchone()
for r in results:
  print type(r) # Returns as string {'count': 0L} Or {'count': 1L}

谢谢。

【问题讨论】:

  • count 将只返回 1 行(在这种情况下)
  • type(r)不会返回为{'count': 0L}。它很可能会打印 <type 'dict'> 或类似的。
  • type(r) 返回 {'count': 0L} 直接来自控制台。

标签: python postgresql psycopg2


【解决方案1】:

以下对我有用

cur.execute('select * from table where guid = %s;',[guid])
rows = cur.fetchall()
print 'ResultCount = %d' % len(rows)

缺点: 如果 all 您需要的只是计数,那么这对于 DBMS 来说不是很有效。

【讨论】:

  • 我知道这是旧的,但它肯定会总是返回 1 行吗?所以 len(rows) 永远是 1?
  • 我正在使用fetchall 函数。如果我使用fetchone 函数,我相信你是对的。编辑:我明白你的意思:SQL 查询将始终返回一行,这意味着 len(rows) 将始终为 1。我想我应该从查询中删除聚合 count 函数以显示我的意思。谢谢
  • @alejando 要么,要么将聚合留在查询中,使用 fetchone,然后从返回的行元组中提取聚合。即 cur.execute('select count(*) from table');行 = cur.fetchone();计数=行[0];如果行集很大,这将更有效率
  • 同意。这就是为什么我在回答中提到了缺点。但是,如果我将其更改为您建议的内容,我不妨删除我的答案,因为它会停止对任何遇到此问题的人做出任何贡献。我认为有些人可以从使用fetchall 函数中受益。
【解决方案2】:

results 本身就是一个行对象,在你的情况下(根据声称的print 输出判断),一个字典(你可能配置了一个dict-like cursor subclass);只需访问count 键:

result = cur.fetchone()
print result['count']

因为您使用了.fetchone(),所以只返回一行,而不是行列表。

如果您使用 dict(-like) 行游标,则行是元组并且计数值是第一个值:

result = cur.fetchone()
print result[0]

【讨论】:

  • 你写:“行是元组,计数值是第一个值”。第二个值是多少?当我做一个计数(*)时,我得到“(1,)”(对于一个计数=1的表)。元组中的第二个值是多少?
  • @BertC:只有一个值,除非您更改 SELECT 列表以产生更多值。就像SELECT COUNT(*), MIN(some_column) FROM table 会产生一个包含两个值的单行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
相关资源
最近更新 更多