set_
parameter mengharapkan pemetaan dengan nama kolom sebagai kunci dan ekspresi atau literal sebagai nilai , tetapi Anda meneruskan pemetaan dengan kamus bersarang sebagai nilai, yaitu df.to_dict(orient='dict')
. Kesalahan "tidak dapat mengadaptasi tipe 'dict'" adalah hasil dari SQLAlchemy yang meneruskan kamus tersebut ke Psycopg2 sebagai "literal".
Karena Anda mencoba menyisipkan beberapa baris dalam satu INSERT menggunakan klausa VALUES, Anda harus menggunakan excluded
dalam tindakan SET. DIKECUALIKAN adalah tabel khusus yang mewakili baris yang dimaksudkan untuk disisipkan.
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)