set_
パラメータは、列名をキーとして、式またはリテラルを値としてマッピングすることを想定しています。 、ただし、ネストされた辞書を値として持つマッピングを渡します。つまり、df.to_dict(orient='dict')
。 「タイプ'dict'を適応できません」というエラーは、SQLAlchemyがそれらの辞書を「リテラル」としてPsycopg2に渡した結果です。
VALUES句を使用して1つのINSERTに複数の行を挿入しようとしているため、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)