Løb ind i et lignende problem, og den nuværende accepterede løsning var for langsom for mig. Mit bord havde 500k+ rækker, og jeg skulle opdatere 100k+ rækker. Efter længere tids research og forsøg og fejl nåede jeg frem til en effektiv og korrekt løsning.
Ideen er at bruge psycopg som din skribent og at bruge en midlertidig tabel. df
er din pandas dataramme, der indeholder værdier, du vil indstille.
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()