PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So verwenden Sie Pandas für Upsert in SqlAlchemy

Der set_ Parameter erwartet ein Mapping mit Spaltennamen als Schlüssel und Ausdrücken oder Literalen als Werte , aber Sie übergeben eine Zuordnung mit verschachtelten Wörterbüchern als Werte, d. h. df.to_dict(orient='dict') . Der Fehler "can't adapt type 'dict'" ist das Ergebnis davon, dass SQLAlchemy diese Wörterbücher als "Literale" an Psycopg2 übergibt.

Da Sie versuchen, mithilfe der VALUES-Klausel mehrere Zeilen in einem einzigen INSERT einzufügen, sollten Sie excluded in den SET-Aktionen. AUSGESCHLOSSEN ist eine spezielle Tabelle, die die Zeilen darstellt, die eingefügt werden sollen.

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)