Du kan använda dessa anslutningar och undvika SQLAlchemy. Det här kommer att låta ganska ointuitivt, men det kommer att vara mycket snabbare än vanliga infogningar (även om du skulle släppa ORM och göra en allmän fråga, t.ex. med executemany
). Infogningar är långsamma, även med obearbetade frågor, men du ser att COPY
nämns flera gånger i Hur man snabbar upp insättningsprestanda i PostgreSQL
. I det här fallet är mina motiveringar för tillvägagångssättet nedan:
- Använd
COPY
istället förINSERT
- Lita inte på att Pandas genererar rätt SQL för den här operationen (även om, som noterats av Ilja Everilä, detta tillvägagångssätt faktiskt fick tillagd till Pandas i V0.24 )
- Skriv inte data till disken för att göra ett verkligt filobjekt; behåll allt i minnet
Föreslagen metod med 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()
Detta bör vara storleksordningar snabbare än att faktiskt göra insatser.