Stötte på ett liknande problem och den nuvarande accepterade lösningen var för långsam för mig. Mitt bord hade 500k+ rader och jag behövde uppdatera 100k+ rader. Efter lång forskning och försök och misstag kom jag fram till en effektiv och korrekt lösning.
Tanken är att använda psycopg som din skribent och att använda en temporär tabell. df
är din pandas dataram som innehåller värden du vill ställa in.
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()