set_
parametern förväntar sig en mappning med kolumnnamn som nycklar och uttryck eller bokstaver som värden , men du skickar en mappning med kapslade ordböcker som värden, t.ex. df.to_dict(orient='dict')
. Felet "kan inte anpassa typ 'dict'" är resultatet av att SQLAlchemy skickade dessa ordböcker till Psycopg2 som "literals".
Eftersom du försöker infoga flera rader i en enda INSERT med hjälp av VALUES-satsen, bör du använda excluded
i SET-åtgärderna. EXCLUDED är en speciell tabell som representerar raderna som är avsedda att infogas.
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)