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

Jak używać kursorów po stronie serwera z psycopg2

Psycopg2 ma ładny interfejs do pracy z kursorami po stronie serwera. To jest możliwy szablon do użycia:

with psycopg2.connect(database_connection_string) as conn:
    with conn.cursor(name='name_of_cursor') as cursor:

        cursor.itersize = 20000

        query = "SELECT * FROM ..."
        cursor.execute(query)

        for row in cursor:
            # process row 

Powyższy kod tworzy połączenie i automatycznie umieszcza wynik zapytania w kursorze po stronie serwera. Wartość itersize ustawia liczbę wierszy, które klient wyciągnie jednocześnie z kursora po stronie serwera. Użyta wartość powinna zrównoważyć liczbę wywołań sieciowych w stosunku do użycia pamięci na kliencie. Na przykład, jeśli liczba Twoich wyników wynosi trzy miliony, itersize wartość 2000 (wartość domyślna) spowoduje 1500 połączeń sieciowych. Jeśli pamięć zajęta przez 2000 wierszy jest niewielka, zwiększ tę liczbę.

Gdy używasz for row in cursor oczywiście pracujesz z jednym wierszem na raz, ale Psycopg2 pobierze z wyprzedzeniem itersize rzędy na raz dla Ciebie.

Jeśli chcesz użyć fetchmany z jakiegoś powodu możesz zrobić coś takiego:

while True:
    rows = cursor.fetchmany(100)
    if len(rows) > 0:
        for row in rows:
            # process row
    else:
        break

To użycie fetchmany nie wyzwoli wywołania sieciowego do serwera dla większej liczby wierszy, dopóki wstępnie pobrana partia nie zostanie wyczerpana. (Jest to zawiły przykład, który nie zawiera niczego poza powyższym kodem, ale demonstruje, jak używać fetchmany jeśli zajdzie taka potrzeba).



  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 przeprowadzić wyszukiwanie bez rozróżniania wielkości liter w kolumnie Postgres 9.4 JSONB?

  2. Zapytanie o element tablicy w kolumnie JSON

  3. Travis CI:FATAL:rola nie istnieje

  4. Jak upuścić wiele (ale nie wszystkie) stołów za jednym zamachem?

  5. SQL ORDER BY z CASE z UNION ALL