W przypadku kursora po stronie serwera, chociaż cursor.execute() zwraca, zapytanie niekoniecznie zostało w tym momencie wykonane przez serwer, więc liczba wierszy nie jest dostępna dla psycopg2 . Jest to zgodne ze specyfikacją DBAPI 2.0
który stwierdza, że rowcount powinna wynosić -1, jeśli liczba wierszy ostatniej operacji jest nieokreślona.
Próbuje wymusić to za pomocą cursor.fetchone() , na przykład aktualizuje cursor.rowcount , ale tylko według liczby pobranych elementów, więc nie jest to przydatne. cursor.fetchall() spowoduje rowcount jednak prawidłowo ustawiony, który wykonuje pełne zapytanie i przesyła dane, których chcesz uniknąć.
Możliwe obejście, które pozwala uniknąć całkowicie oddzielnego zapytania w celu uzyskania liczby i które powinno dawać dokładne wyniki, to:
select *, (select count(*) from test) from test;
Spowoduje to, że do każdego wiersza zostanie dodana liczba wierszy tabeli jako ostatnia kolumna. Następnie możesz uzyskać liczbę wierszy tabeli za pomocą cursor.fetchone() a następnie biorąc ostatnią kolumnę:
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]
Teraz count będzie zawierać liczbę wierszy w tabeli. Możesz użyć row[:-1] aby odnieść się do danych wiersza.
Może to spowolnić zapytanie, ponieważ prawdopodobnie kosztowny SELECT COUNT(*) zostanie wykonane, ale po zakończeniu pobieranie danych powinno być szybkie.