J'ai rencontré un problème similaire et la solution actuellement acceptée était trop lente pour moi. Ma table avait plus de 500 000 lignes et j'avais besoin de mettre à jour plus de 100 000 lignes. Après de longues recherches et essais et erreurs, je suis arrivé à une solution efficace et correcte.
L'idée est d'utiliser psycopg comme écrivain et d'utiliser une table temporaire. df
est votre dataframe pandas qui contient les valeurs que vous souhaitez définir.
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()