set_
parameter forventer en tilknytning med kolonnenavne som nøgler og udtryk eller bogstaver som værdier , men du sender en kortlægning med indlejrede ordbøger som værdier, dvs. df.to_dict(orient='dict')
. Fejlen "kan ikke tilpasse typen 'dict'" er resultatet af, at SQLAlchemy har videregivet disse ordbøger til Psycopg2 som "bogstaver".
Fordi du forsøger at indsætte flere rækker i en enkelt INSERT ved hjælp af VALUES-sætningen, bør du bruge excluded
i SET-handlingerne. EXCLUDED er en speciel tabel, der repræsenterer de rækker, der er beregnet til at blive indsat.
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)