PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak używać pand do robienia upsert w SqlAlchemy?

set_ parametr oczekuje mapowania z nazwami kolumn jako kluczami i wyrażeniami lub literałami jako wartościami , ale przekazujesz mapowanie ze słownikami zagnieżdżonymi jako wartościami, tj. df.to_dict(orient='dict') . Błąd „nie można dostosować typu 'dict'” jest wynikiem przekazania tych słowników przez SQLAlchemy do Psycopg2 jako „literały”.

Ponieważ próbujesz wstawić wiele wierszy w jednej INSERT przy użyciu klauzuli VALUES, powinieneś użyć excluded w akcjach SET. EXCLUDED to specjalna tabela reprezentująca wiersze przeznaczone do wstawienia.

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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oświadczenie Postgres CASE we wstawce

  2. Dostęp do Postgres RDS z klastra Kubernetes w AWS

  3. Import PostgreSQL CSV z wiersza poleceń

  4. Czy możemy użyć poleceń DDL w przygotowanym oświadczeniu (PostgreSQL)?

  5. Metoda uwierzytelniania PostgreSQL 10 nie jest obsługiwana