sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo actualizar una columna de tabla de Postgres usando un marco de datos de pandas?

Me encontré con un problema similar y la solución aceptada actual fue demasiado lenta para mí. Mi tabla tenía más de 500k filas y necesitaba actualizar más de 100k filas. Después de una larga investigación y prueba y error, llegué a una solución eficiente y correcta.

La idea es usar psycopg como escritor y usar una tabla temporal. df es su marco de datos de pandas que contiene los valores que desea establecer.

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