set_
parametr očekává mapování s názvy sloupců jako klíče a výrazy nebo literály jako hodnoty , ale předáváte mapování s vnořenými slovníky jako hodnotami, tj. df.to_dict(orient='dict')
. Chyba „nelze přizpůsobit typ 'dict'“ je výsledkem toho, že SQLAlchemy předala tyto slovníky Psycopg2 jako „literály“.
Protože se pokoušíte vložit více řádků do jednoho INSERT pomocí klauzule VALUES, měli byste použít excluded
v akcích SET. EXCLUDED je speciální tabulka představující řádky, které mají být vloženy.
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)