sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man skriver en dataram till Postgres-tabellen utan att använda SQLAlchemy-motorn?

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:

  1. Använd COPY istället för INSERT
  2. 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 )
  3. 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.




  1. KONVERTERA MySQL-fråga till SQL Server (MSSQL / SQLSRV) (Med DISTINCT)

  2. MySQL - Kan inte skapa vy med SET-variabel inuti

  3. Betyder utvecklande kontaktinformation att du ändrar din databas?

  4. Hur fungerar indexering