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)