Можете да използвате тези връзки и да избегнете SQLAlchemy. Това ще звучи доста неинтуитивно, но ще бъде много по-бързо от обикновените вмъквания (дори ако трябва да изпуснете ORM и да направите обща заявка, напр. с executemany
). Вмъкванията са бавни, дори и при необработени заявки, но ще видите, че COPY
се споменава няколко пъти в Как да ускоря производителност на вмъкване в PostgreSQL
. В този случай моите мотиви за подхода по-долу са:
- Използвайте
COPY
вместоINSERT
- Не се доверявайте на Pandas за генериране на правилния SQL за тази операция (въпреки че, както е отбелязано от Ilja Everilä, този подход всъщност получи добавен към Pandas във V0.24 )
- Не записвайте данните на диска, за да създадете действителен файлов обект; запазете всичко в паметта
Предложен подход с използване на cursor.copy_from()
:
import csv
import io
import psycopg2
df = "<your_df_here>"
# drop all the columns you don't want in the insert data here
# First take the headers
headers = df.columns
# Now get a nested list of values
data = df.values.tolist()
# Create an in-memory CSV file
string_buffer = io.StringIO()
csv_writer = csv.writer(string_buffer)
csv_writer.writerows(data)
# Reset the buffer back to the first line
string_buffer.seek(0)
# Open a connection to the db (which I think you already have available)
with psycopg2.connect(dbname=current_app.config['POSTGRES_DB'],
user=current_app.config['POSTGRES_USER'],
password=current_app.config['POSTGRES_PW'],
host=current_app.config['POSTGRES_URL']) as conn:
c = conn.cursor()
# Now upload the data as though it was a file
c.copy_from(string_buffer, 'the_table_name', sep=',', columns=headers)
conn.commit()
Това би трябвало да е с порядък по-бързо от действителното извършване на вмъквания.