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

Cómo usar pandas para hacer upsert en SqlAlchemy

El set_ el parámetro espera una asignación con nombres de columnas como claves y expresiones o literales como valores , pero está pasando una asignación con diccionarios anidados como valores, es decir, df.to_dict(orient='dict') . El error "no se puede adaptar el tipo 'dict'" es el resultado de SQLAlchemy pasando esos diccionarios a Psycopg2 como "literales".

Debido a que está tratando de insertar varias filas en un solo INSERT usando la cláusula VALUES, debe usar excluded en las acciones del SET. EXCLUIDOS es una tabla especial que representa las filas que se deben insertar.

insert_statement = postgresql.insert(my_table).values(df.to_dict(orient='records'))
upsert_statement = insert_statement.on_conflict_do_update(
    index_elements=['id'],
    set_={c.key: c for c in insert_statement.excluded if c.key != 'id'})
conn.execute(upsert_statement)