set_
параметърът очаква съпоставяне с имена на колони като ключове и изрази или литерали като стойности , но вие предавате съпоставяне с вложени речници като стойности, т.е. df.to_dict(orient='dict')
. Грешката „не може да адаптира тип „dict““ е резултат от това, че SQLAlchemy предава тези речници на Psycopg2 като „литерали“.
Тъй като се опитвате да вмъкнете няколко реда в единичен INSERT, като използвате клаузата VALUES, трябва да използвате excluded
в действията SET. EXCLUDED е специална таблица, представяща редовете, предназначени за вмъкване.
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)