PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Psycopg2 liczba wierszy dla kursora po stronie serwera

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać maksymalną punktację gracza z każdej grupy za pomocą SQL?

  2. Szybki sposób na sprawdzenie liczby wierszy tabeli w PostgreSQL

  3. Rekordy PostgreSQL CTE jako parametry do działania

  4. ILIKE Dopasuj granice słów PostgreSQL 9

  5. zadanie seler nie może iterować przez wiele wierszy z bazy danych postgresql za pomocą pythona