PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come usare i panda per eseguire l'upsert in SqlAlchemy

Il set_ il parametro prevede una mappatura con nomi di colonna come chiavi e espressioni o letterali come valori , ma stai passando una mappatura con dizionari nidificati come valori, ad esempio df.to_dict(orient='dict') . L'errore "impossibile adattare il tipo 'dict'" è il risultato di SQLAlchemy che passa quei dizionari a Psycopg2 come "letterali".

Poiché stai tentando di inserire più righe in un singolo INSERT utilizzando la clausola VALUES, dovresti utilizzare excluded nelle azioni SET. EXCLUDED è una tabella speciale che rappresenta le righe da inserire.

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)