set_
parametr oczekuje mapowania z nazwami kolumn jako kluczami i wyrażeniami lub literałami jako wartościami , ale przekazujesz mapowanie ze słownikami zagnieżdżonymi jako wartościami, tj. df.to_dict(orient='dict')
. Błąd „nie można dostosować typu 'dict'” jest wynikiem przekazania tych słowników przez SQLAlchemy do Psycopg2 jako „literały”.
Ponieważ próbujesz wstawić wiele wierszy w jednej INSERT przy użyciu klauzuli VALUES, powinieneś użyć excluded
w akcjach SET. EXCLUDED to specjalna tabela reprezentująca wiersze przeznaczone do wstawienia.
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)