В случай на курсор от страна на сървъра, въпреки че 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(*)
ще се изпълни, но след като приключи, извличането на данните трябва да е бързо.