sql >> Databáze >  >> RDS >> PostgreSQL

Psychopg2 rowcount pro kurzor na straně serveru

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




  1. Tenký připojovací řetězec JDBC v Oracle používá dvojtečku i lomítko

  2. úložiště dat mysql a výkon dotazů s php

  3. Vytvořte neměnný klon concat_ws

  4. Jak otestovat, zda je řetězec JSON nebo ne?