PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment écrire une trame de données dans la table Postgres sans utiliser le moteur SQLAlchemy ?

Vous pouvez utiliser ces connexions et éviter SQLAlchemy. Cela va sembler plutôt peu intuitif, mais ce sera beaucoup plus rapide que les insertions régulières (même si vous deviez supprimer l'ORM et faire une requête générale, par exemple avec executemany ). Les insertions sont lentes, même avec des requêtes brutes, mais vous verrez que COPY est mentionné plusieurs fois dans Comment accélérer performances d'insertion dans PostgreSQL . Dans ce cas, mes motivations pour l'approche ci-dessous sont :

  1. Utilisez COPY au lieu de INSERT
  2. Ne faites pas confiance à Pandas pour générer le bon SQL pour cette opération (bien que, comme l'a noté Ilja Everilä, cette approche a en fait obtenu ajouté à Pandas dans la V0.24 )
  3. N'écrivez pas les données sur le disque pour en faire un véritable objet fichier ; gardez tout en mémoire

Approche suggérée utilisant 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()

Cela devrait être des ordres de grandeur plus rapides que de faire des insertions.