sql >> Database >  >> RDS >> PostgreSQL

Hoe een dataframe naar een Postgres-tabel te schrijven zonder de SQLAlchemy-engine te gebruiken?

U kunt die verbindingen gebruiken en SQLAlchemy vermijden. Dit klinkt nogal onintuïtief, maar het zal veel sneller zijn dan gewone invoegingen (zelfs als je de ORM zou laten vallen en een algemene query zou maken, bijvoorbeeld met executemany ). Invoegingen zijn traag, zelfs met onbewerkte zoekopdrachten, maar je zult zien dat COPY wordt meerdere keren genoemd in Hoe te versnellen invoegprestaties in PostgreSQL . In dit geval zijn mijn motivaties voor de onderstaande aanpak:

  1. Gebruik COPY in plaats van INSERT
  2. Vertrouw Pandas niet om de juiste SQL voor deze bewerking te genereren (hoewel, zoals opgemerkt door Ilja Everilä, deze aanpak feitelijk toegevoegd aan Panda's in V0.24 )
  3. Schrijf de gegevens niet naar schijf om een ​​echt bestandsobject te maken; bewaar het allemaal in het geheugen

Voorgestelde aanpak met behulp van 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()

Dit zou orden van grootte sneller moeten zijn dan het daadwerkelijk invoegen.




  1. Fout 'Geen geschikt stuurprogramma gevonden' voor gebruik van een database in een webservice op Glassfish-server

  2. Hoe OR &AND te gebruiken in de WHERE-clausule in mysql

  3. Selecteer statement om duplicaten op bepaalde velden te vinden

  4. Gegroepeerde tekenreeksaggregatie / LISTAGG voor SQL Server