PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment utiliser les pandas pour faire upsert dans SqlAlchemy

Le set_ le paramètre attend un mappage avec des noms de colonnes comme clés et des expressions ou des littéraux comme valeurs , mais vous passez un mappage avec des dictionnaires imbriqués comme valeurs, c'est-à-dire df.to_dict(orient='dict') . L'erreur "impossible d'adapter le type 'dict'" est le résultat de la transmission par SQLAlchemy de ces dictionnaires à Psycopg2 en tant que "littéraux".

Étant donné que vous essayez d'insérer plusieurs lignes dans un seul INSERT à l'aide de la clause VALUES, vous devez utiliser excluded dans les actions SET. EXCLU est une table spéciale représentant les lignes destinées à être insérées.

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)