PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como gravar o quadro de dados na tabela Postgres sem usar o mecanismo SQLAlchemy?


Você pode usar essas conexões e evitar SQLAlchemy. Isso vai parecer pouco intuitivo, mas será muito mais rápido do que inserções regulares (mesmo se você descartar o ORM e fazer uma consulta geral, por exemplo, com executemany ). As inserções são lentas, mesmo com consultas brutas, mas você verá que COPY é mencionado várias vezes em Como acelerar desempenho de inserção no PostgreSQL . Neste caso, minhas motivações para a abordagem abaixo são:
  1. Usar COPY em vez de INSERT
  2. Não confie no Pandas para gerar o SQL correto para esta operação (embora, conforme observado por Ilja Everilä, essa abordagem tenha adicionado ao Pandas na V0.24 )
  3. Não grave os dados no disco para criar um objeto de arquivo real; guarde tudo na memória

Abordagem sugerida 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()

Isso deve ser ordens de magnitude mais rápido do que realmente fazer inserções.