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