psycopg2:如何知道 cur.rowcount 何时不表示行数?
psycopg2: How to know when cur.rowcount does not mean number of rows?
我正在寻找一种方法来以编程方式确定 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。
这个区别至少在理论上很简单 rowcount
将返回所有 DQL(数据查询语言)和 DML(数据操作语言)查询(您的 SELECT
、UPDATE
、DELETE
等)。对于 DDL(数据定义语言)查询,您将有 -1
——(CREATE
、DROP
、ALTER
等)。
换句话说,如果你实际操作数据,你可以期望rowcount
被定义(意思是>=0);如果您使用 database/table 架构 - 您将拥有 rowcount = -1
.
至于确定 fetchall()
何时起作用,您始终可以使用 EAFP approach - 尝试执行 fetchall()
并处理 ProgrammingError
。
另见:
- What is DDL and DML
根据 docs,对于没有结果集的操作,cur.description
将是 None
。
我正在寻找一种方法来以编程方式确定 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。
这个区别至少在理论上很简单 rowcount
将返回所有 DQL(数据查询语言)和 DML(数据操作语言)查询(您的 SELECT
、UPDATE
、DELETE
等)。对于 DDL(数据定义语言)查询,您将有 -1
——(CREATE
、DROP
、ALTER
等)。
换句话说,如果你实际操作数据,你可以期望rowcount
被定义(意思是>=0);如果您使用 database/table 架构 - 您将拥有 rowcount = -1
.
至于确定 fetchall()
何时起作用,您始终可以使用 EAFP approach - 尝试执行 fetchall()
并处理 ProgrammingError
。
另见:
- What is DDL and DML
根据 docs,对于没有结果集的操作,cur.description
将是 None
。