Du kan bruge disse forbindelser og undgå SQLAlchemy. Dette kommer til at lyde ret uintuitivt, men det vil være meget hurtigere end almindelige indsættelser (selvom du skulle droppe ORM'en og lave en generel forespørgsel, f.eks. med executemany
). Indsættelser er langsomme, selv med rå forespørgsler, men du vil se, at COPY
er nævnt flere gange i Sådan gør du hurtigere indsættelsesydelse i PostgreSQL
. I dette tilfælde er mine motiver for nedenstående tilgang:
- Brug
COPY
i stedet forINSERT
- Stol ikke på Pandas til at generere den korrekte SQL til denne operation (selvom, som bemærket af Ilja Everilä, denne tilgang faktisk fik føjet til Pandas i V0.24 )
- Skriv ikke dataene til disken for at lave et egentligt filobjekt; gem det hele i hukommelsen
Foreslået tilgang ved hjælp af 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()
Dette burde være størrelsesordener hurtigere end faktisk at lave indsættelser.