psycopg2:如何知道cur.rowcount何时不代表行数?

时间:2016-12-12 19:25:26

标签: python postgresql psycopg2

我正在寻找一种方法来以编程方式确定描述可用于获取的行数与受影响的行数的cur.rowcount之间的差异。

例如:

>>> cur.execute('CREATE TABLE test (gid serial, val numeric);')
>>> cur.execute('INSERT INTO test (val) values (1), (2), (3);')
>>> cur.execute('SELECT * FROM test;'); cur.rowcount
3
>>> cur.execute('UPDATE test SET val = 1;'); cur.rowcount
3
>>> cur.fetchall()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
psycopg2.ProgrammingError: no results to fetch

>>> cur.execute('DELETE FROM test;'); cur.rowcount
3

>>> cur.execute('DROP TABLE test;')
>>> cur.rowcount
-1

使用Python 2.7和psycopg2 2.6.2。

2 个答案:

答案 0 :(得分:2)

至少在理论上,区别很简单{}}将返回所有 DQL (数据查询语言)和 DML (数据操作语言)查询(您的SELECTUPDATEDELETE等)。对于 DDL (数据定义语言)查询,您将-1 - (CREATEDROPALTER等。< / p>

换句话说,如果您实际操作数据,则可以预期rowcount被定义(意味着> = 0);如果您使用数据库/表架构 - 您将拥有rowcount = -1

至于确定fetchall()何时起作用,您可以随时使用rowcount - 尝试执行fetchall()并处理ProgrammingError

另见:

答案 1 :(得分:1)

根据docscur.description对于没有结果集的操作将为None