sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan skriver man dataramme til Postgres-tabellen uden at bruge SQLAlchemy-motoren?

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:

  1. Brug COPY i stedet for INSERT
  2. 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 )
  3. 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.




  1. Hvordan vælger jeg et fast antal rækker for hver gruppe?

  2. Få opdateret række

  3. SQL Sorteringsrækkefølge med Null-værdier sidst

  4. ORA-01591 - oracle slet data fra ekstern sql server tabel