Der set_
Parameter erwartet ein Mapping mit Spaltennamen als Schlüssel und Ausdrücken oder Literalen als Werte , aber Sie übergeben eine Zuordnung mit verschachtelten Wörterbüchern als Werte, d. h. df.to_dict(orient='dict')
. Der Fehler "can't adapt type 'dict'" ist das Ergebnis davon, dass SQLAlchemy diese Wörterbücher als "Literale" an Psycopg2 übergibt.
Da Sie versuchen, mithilfe der VALUES-Klausel mehrere Zeilen in einem einzigen INSERT einzufügen, sollten Sie excluded
in den SET-Aktionen. AUSGESCHLOSSEN ist eine spezielle Tabelle, die die Zeilen darstellt, die eingefügt werden sollen.
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)