V případě kurzoru na straně serveru, i když cursor.execute() vrátí, dotaz nebyl v tomto okamžiku nutně proveden serverem, takže počet řádků není pro psycopg2 dostupný . To je v souladu se specifikací DBAPI 2.0
který uvádí, že rowcount by mělo být -1, pokud je počet řádků poslední operace neurčitý.
Pokusy o vynucení pomocí cursor.fetchone() , například aktualizuje cursor.rowcount , ale pouze podle počtu načtených položek, takže to není užitečné. cursor.fetchall() výsledkem bude rowcount pokud je však správně nastaven, provede úplný dotaz a přenos dat, kterým se chcete vyhnout.
Možné řešení, které se vyhýbá zcela samostatnému dotazu pro získání počtu a které by mělo poskytovat přesné výsledky, je:
select *, (select count(*) from test) from test;
Výsledkem bude, že každý řádek bude mít jako poslední sloupec připojen počet řádků tabulky. Potom můžete získat počet řádků tabulky pomocí cursor.fetchone() a poté poslední sloupec:
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]
Nyní count bude obsahovat počet řádků v tabulce. Můžete použít row[:-1] odkazovat na data řádku.
To může zpomalit dotaz, protože může být drahé SELECT COUNT(*) se provede, ale po dokončení by načítání dat mělo být rychlé.