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.