PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie aktualisiere ich eine Postgres-Tabellenspalte mit einem Pandas-Datenrahmen?

Bin auf ein ähnliches Problem gestoßen und die aktuell akzeptierte Lösung war zu langsam für mich. Meine Tabelle hatte mehr als 500.000 Zeilen und ich musste mehr als 100.000 Zeilen aktualisieren. Nach langer Recherche und Versuch und Irrtum bin ich zu einer effizienten und korrekten Lösung gekommen.

Die Idee ist, psycopg als Writer zu verwenden und eine temporäre Tabelle zu verwenden. df ist Ihr Pandas-Datenrahmen, der Werte enthält, die Sie festlegen möchten.

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