В случай на курсор от страна на сървъра, въпреки че cursor.execute() връща, заявката не е задължително да е била изпълнена от сървъра в този момент и така броят на редовете не е достъпен за psycopg2 . Това е в съответствие със спецификацията DBAPI 2.0
което гласи, че rowcount трябва да бъде -1, ако броят на редовете на последната операция е неопределен.
Опитва се да го принуди с cursor.fetchone() , например, актуализира cursor.rowcount , но само по броя на извлечените елементи, така че това не е полезно. cursor.fetchall() ще доведе до rowcount е правилно настроено обаче, което изпълнява пълната заявка и прехвърляне на данни, които искате да избегнете.
Възможно заобиколно решение, което избягва напълно отделна заявка за получаване на броя и което трябва да даде точни резултати е:
select *, (select count(*) from test) from test;
Това ще доведе до това, че всеки ред има добавен брой редове в таблицата като последна колона. След това можете да получите броя на редовете в таблицата с помощта на cursor.fetchone() и след това вземете последната колона:
with db.cursor('cursor_name') as cursor:
cursor.execute('select *, (select count(*) from test) from test')
row = cursor.fetchone()
data, count = row[:-1], row[-1]
Сега count ще съдържа броя на редовете в таблицата. Можете да използвате row[:-1] за препратка към данните на реда.
Това може да забави заявката поради евентуално скъп SELECT COUNT(*) ще се изпълни, но след като приключи, извличането на данните трябва да е бързо.