self.pgresult = None
self._pos = 0
self._iresult = 0
+ self._rowcount = -1
@property
def closed(self) -> bool:
@property
def rowcount(self) -> int:
- res = self.pgresult
- if res is None or res.status != self.ExecStatus.TUPLES_OK:
- return -1
- else:
- return res.ntuples
+ return self._rowcount
def setinputsizes(self, sizes: Sequence[Any]) -> None:
# no-op
if not badstats:
self._results = list(results)
self.pgresult = results[0]
+ nrows = self.pgresult.command_tuples
+ if nrows is not None:
+ if self._rowcount < 0:
+ self._rowcount = nrows
+ else:
+ self._rowcount += nrows
+
return
if results[-1].status == S.FATAL_ERROR:
if self._iresult < len(self._results):
self.pgresult = self._results[self._iresult]
self._pos = 0
+ nrows = self.pgresult.command_tuples
+ self._rowcount = nrows if nrows is not None else -1
return True
else:
return None
cur = conn.cursor()
assert cur.nextset() is None
- rv = cur.execute("select 'foo'; select 'bar'")
+ rv = cur.execute("select 'foo'; select generate_series(1,3)")
assert rv is cur
- assert len(cur._results) == 2
- assert cur.pgresult.get_value(0, 0) == b"foo"
+ assert cur.fetchall() == [("foo",)]
+ assert cur.rowcount == 1
assert cur.nextset()
- assert cur.pgresult.get_value(0, 0) == b"bar"
+ assert cur.fetchall() == [(1,), (2,), (3,)]
assert cur.nextset() is None
cur.close()
assert cur.fetchall() == [(11, "hello"), (21, "world")]
-@pytest.mark.xfail
def test_executemany_rowcount(conn, execmany):
cur = conn.cursor()
cur.executemany(
cur = conn.cursor()
with pytest.raises(psycopg3.DatabaseError):
cur.executemany(query, [(10, "hello"), (20, "world")])
+
+
+def test_rowcount(conn):
+ cur = conn.cursor()
+ cur.execute("select 1 from generate_series(1, 42)")
+ assert cur.rowcount == 42
+
+ cur.execute("create table test_rowcount_notuples (id int primary key)")
+ assert cur.rowcount == -1
+
+ cur.execute(
+ "insert into test_rowcount_notuples select generate_series(1, 42)"
+ )
+ assert cur.rowcount == 42
+
+ cur.close()
+ assert cur.rowcount == -1
cur = aconn.cursor()
assert cur.nextset() is None
- rv = await cur.execute("select 'foo'; select 'bar'")
+ rv = await cur.execute("select 'foo'; select generate_series(1,3)")
assert rv is cur
- assert len(cur._results) == 2
- assert cur.pgresult.get_value(0, 0) == b"foo"
+ assert (await cur.fetchall()) == [("foo",)]
+ assert cur.rowcount == 1
assert cur.nextset()
- assert cur.pgresult.get_value(0, 0) == b"bar"
+ assert (await cur.fetchall()) == [(1,), (2,), (3,)]
+ assert cur.rowcount == 3
assert cur.nextset() is None
await cur.close()
assert rv == [(11, "hello"), (21, "world")]
-@pytest.mark.xfail
async def test_executemany_rowcount(aconn, execmany):
cur = aconn.cursor()
await cur.executemany(
cur = aconn.cursor()
with pytest.raises(psycopg3.DatabaseError):
await cur.executemany(query, [(10, "hello"), (20, "world")])
+
+
+async def test_rowcount(aconn):
+ cur = aconn.cursor()
+
+ await cur.execute("select 1 from generate_series(1, 42)")
+ assert cur.rowcount == 42
+
+ await cur.execute(
+ "create table test_rowcount_notuples (id int primary key)"
+ )
+ assert cur.rowcount == -1
+
+ await cur.execute(
+ "insert into test_rowcount_notuples select generate_series(1, 42)"
+ )
+ assert cur.rowcount == 42
+
+ await cur.close()
+ assert cur.rowcount == -1