Извлечение данных из базы данных postgres в пакетном режиме (python) - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть следующий запрос Postgres, в котором я получаю данные из таблицы1 со строками ~ 25 миллионов и хотел бы записать вывод приведенного ниже запроса в несколько файлов.

query = """ WITH sequence AS (
                SELECT 
                        a,
                        b,
                        c
                FROM table1 )                    

select * from sequence;"""

Ниже приведен python скрипт для получения полного набора данных. Как я могу изменить скрипт для извлечения его в несколько файлов (например, каждый файл имеет 10000 строк)

#IMPORT LIBRARIES ########################
import psycopg2
from pandas import DataFrame

#CREATE DATABASE CONNECTION ########################
connect_str = "dbname='x' user='x' host='x' " "password='x' port = x"
conn = psycopg2.connect(connect_str)
cur = conn.cursor()
conn.autocommit = True

cur.execute(query)
df = DataFrame(cur.fetchall())

Спасибо

1 Ответ

2 голосов
/ 11 февраля 2020

Вот 3 метода, которые могут помочь

  1. использовать psycopg2 именованный курсор cursor.itersize = 2000

фрагмент

 with conn.cursor(name='fetch_large_result') as cursor:

    cursor.itersize = 20000

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

    for row in cursor:
....
использовать psycopg2 именованный курсор fetchmany (размер = 2000)

фрагмент

conn = psycopg2.connect(conn_url)
cursor = conn.cursor(name='fetch_large_result')
cursor.execute('SELECT * FROM <large_table>')

while True:
    # consume result over a series of iterations
    # with each iteration fetching 2000 records
    records = cursor.fetchmany(size=2000)

    if not records:
        break

    for r in records:
        ....

cursor.close() #  cleanup
conn.close()

Наконец, вы можете определить КНОПКА СВИТОК

Определить КУРСОР СКРОСА

фрагмент

BEGIN MY_WORK;
-- Set up a cursor:
DECLARE scroll_cursor_bd SCROLL CURSOR FOR SELECT * FROM My_Table;

-- Fetch the first 5 rows in the cursor scroll_cursor_bd:

FETCH FORWARD 5 FROM scroll_cursor_bd;
CLOSE scroll_cursor_bd;
COMMIT MY_WORK;

Обратите внимание Не называть курсор в psycopg2 курсор будет на стороне клиента, а не на стороне сервера.

...