Мне было поручено манипулировать и переносить некоторые данные из файлов 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 для начинающих.