Anda dapat menggunakan koneksi tersebut dan menghindari SQLAlchemy. Ini akan terdengar agak tidak intuitif, tetapi akan jauh lebih cepat daripada penyisipan biasa (bahkan jika Anda menghapus ORM dan membuat kueri umum, misalnya dengan executemany
). Sisipan lambat, bahkan dengan kueri mentah, tetapi Anda akan melihat COPY
disebutkan beberapa kali dalam Cara mempercepat kinerja penyisipan di PostgreSQL
. Dalam hal ini, motivasi saya untuk pendekatan di bawah ini adalah:
- Gunakan
COPY
bukannyaINSERT
- Jangan percaya Panda untuk menghasilkan SQL yang benar untuk operasi ini (walaupun, seperti yang dicatat oleh Ilja Everilä, pendekatan ini sebenarnya mendapatkan ditambahkan ke Panda di V0.24 )
- Jangan menulis data ke disk untuk membuat objek file yang sebenarnya; simpan semuanya dalam ingatan
Pendekatan yang disarankan menggunakan 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()
Ini seharusnya lebih cepat daripada melakukan penyisipan.