Natknąłem się na podobny problem, a obecnie przyjęte rozwiązanie było dla mnie zbyt wolne. Mój stół miał ponad 500 000 wierszy i musiałem zaktualizować ponad 100 000 wierszy. Po długich badaniach i próbach i błędach doszedłem do skutecznego i poprawnego rozwiązania.
Pomysł polega na tym, aby użyć psycopg jako swojego pisarza i użyć tymczasowej tabeli. df
to twoja ramka danych pandy, która zawiera wartości, które chcesz ustawić.
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()