De set_
parameter verwacht een toewijzing met kolomnamen als sleutels en expressies of letterlijke waarden als waarden , maar u geeft een toewijzing door met geneste woordenboeken als waarden, d.w.z. df.to_dict(orient='dict')
. De fout "kan het type 'dict' niet aanpassen" is het resultaat van het doorgeven van die woordenboeken door SQLAlchemy aan Psycopg2 als "literals".
Omdat u meerdere rijen in een enkele INSERT probeert in te voegen met behulp van de VALUES-clausule, moet u excluded
in de SET-acties. EXCLUDED is een speciale tabel die de rijen vertegenwoordigt die bedoeld zijn om in te voegen.
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)