sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo escribir un marco de datos en la tabla de Postgres sin usar el motor SQLAlchemy?

Puede usar esas conexiones y evitar SQLAlchemy. Esto va a sonar bastante poco intuitivo, pero será mucho más rápido que las inserciones normales (incluso si tuviera que soltar el ORM y realizar una consulta general, por ejemplo, con executemany ). Las inserciones son lentas, incluso con consultas sin procesar, pero verá que COPY se menciona varias veces en Cómo acelerar rendimiento de inserción en PostgreSQL . En este caso, mis motivaciones para el siguiente enfoque son:

  1. Usar COPY en lugar de INSERT
  2. No confíe en Pandas para generar el SQL correcto para esta operación (aunque, como señaló Ilja Everilä, este enfoque en realidad obtuvo agregado a Pandas en V0.24 )
  3. No escriba los datos en el disco para crear un objeto de archivo real; guardarlo todo en la memoria

Enfoque sugerido usando 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()

Esto debería ser mucho más rápido que hacer inserciones.