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é.