O
set_
O parâmetro espera um mapeamento com nomes de colunas como chaves e expressões ou literais como valores , mas você está passando um mapeamento com dicionários aninhados como valores, ou seja, df.to_dict(orient='dict')
. O erro "não é possível adaptar o tipo 'dict'" é o resultado do SQLAlchemy passando esses dicionários para o Psycopg2 como "literais". Como você está tentando inserir várias linhas em um único INSERT usando a cláusula VALUES, você deve usar
excluded
nas ações SET. EXCLUDED é uma tabela especial que representa as linhas que devem ser inseridas. 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)