set_
tham số mong đợi một ánh xạ với tên cột là khóa và biểu thức hoặc ký tự dưới dạng giá trị , nhưng bạn đang chuyển một ánh xạ với các từ điển lồng nhau dưới dạng các giá trị, tức là df.to_dict(orient='dict')
. Lỗi "không thể thích ứng kiểu 'dict'" là kết quả của việc SQLAlchemy chuyển các từ điển đó sang Psycopg2 dưới dạng "chữ".
Vì bạn đang cố gắng chèn nhiều hàng trong một CHÈN bằng mệnh đề VALUES, bạn nên sử dụng excluded
trong các hành động SET. EXCLUDED là một bảng đặc biệt đại diện cho các hàng được chèn vào.
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)