PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come aggiornare una colonna di una tabella Postgres utilizzando un frame di dati panda?

Mi sono imbattuto in un problema simile e l'attuale soluzione accettata era troppo lenta per me. La mia tabella aveva oltre 500.000 righe e dovevo aggiornare oltre 100.000 righe. Dopo lunghe ricerche e tentativi ed errori sono arrivato a una soluzione efficiente e corretta.

L'idea è di usare psycopg come scrittore e di usare una tabella temporanea. df è il dataframe del tuo panda che contiene i valori che desideri impostare.

import psycopg2

conn = psycopg2.connect("dbname='db' user='user' host='localhost' password='test'")
cur = conn.cursor()

rows = zip(df.id, df.z)
cur.execute("""CREATE TEMP TABLE codelist(id INTEGER, z INTEGER) ON COMMIT DROP""")
cur.executemany("""INSERT INTO codelist (id, z) VALUES(%s, %s)""", rows)

cur.execute("""
    UPDATE table_name
    SET z = codelist.z
    FROM codelist
    WHERE codelist.id = vehicle.id;
    """)

cur.rowcount
conn.commit()
cur.close()
conn.close()