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)