Мне нужно импортировать данные из файла csv в таблицу postgresql с python эффективно и партиями - PullRequest
0 голосов
/ 12 июля 2020

Я ищу эффективный способ импорта данных из файла CSV в таблицу Postgresql, используя python партиями, поскольку у меня есть довольно большие файлы, а сервер, на который я импортирую данные, находится далеко. Мне нужно эффективное решение, так как все, что я пробовал, было либо медленным, либо просто не работало. Я использую SQLlahcemy. Я хотел использовать необработанный SQL, но его так сложно параметризовать, и мне нужно несколько циклов для выполнения запроса для нескольких строк

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

используйте команду copy_from, она копирует все строки в таблицу.

path=open('file.csv','r')
next(path)
cur.copy_from(path,'table_name',columns=('id','name','email'))
0 голосов
/ 12 июля 2020

Мне было поручено манипулировать и переносить некоторые данные из файлов CSV в удаленный Postgres экземпляр.

Я решил использовать сценарий Python ниже:

import csv
import uuid
import psycopg2
import psycopg2.extras
import time

#Instant Time at the start of the Script
start = time.time()
psycopg2.extras.register_uuid()

#List of CSV Files that I want to manipulate & migrate.
file_list=["Address.csv"]




conn = psycopg2.connect("host=localhost dbname=address user=postgres password=docker")
cur = conn.cursor()

i = 1
for f in file_list:
    f = open(f)
    csv_f = csv.reader(f)
    next(csv_f)
    for row in csv_f:

        # Some simple manipulations on each row
        #Inserting a uuid4 into the first column
        row.pop(0)
        row.insert(0,uuid.uuid4())
        row.pop(10)
        row.insert(10,False)
        row.pop(13)

        #Tracking the number of rows inserted
        print(i)
        i = i + 1

        #INSERT QUERY
        postgres_insert_query = """ INSERT INTO "public"."address"("address_id","address_line_1","locality_area_street","address_name","app_version","channel_type","city","country","created_at","first_name","is_default","landmark","last_name","mobile","pincode","territory","updated_at","user_id") VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
        record_to_insert = row
        cur.execute(postgres_insert_query,record_to_insert)
    f.close()


conn.commit()
conn.close()
print(time.time()-start)

Скрипт работал достаточно хорошо и быстро при локальном тестировании. Но подключение к удаленному серверу базы данных увеличило задержку.

В качестве временного решения я перенес обработанные данные в свой локальный postgres экземпляр. Затем я создал файл. sql перенесенных данных и вручную импортировал файл. sql на удаленный сервер.

В качестве альтернативы вы также можете использовать функции многопоточности Python, для запуска нескольких одновременных подключений к удаленному серверу и выделения отдельного пакетного процесса для каждого подключения и передачи sh данных. Это должно значительно ускорить вашу миграцию.

Я лично не пробовал использовать многопоточность, поскольку в моем случае это не требовалось. Но это кажется чертовски эффективным.

Надеюсь, это помогло! :)

Ресурсы: Обработка CSV с использованием Python для начинающих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...