PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como usar pandas para fazer upsert no SqlAlchemy


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)