PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Postgresql पर sqlalchemy का उपयोग करके उचित अप्सर्ट कैसे करें?

यह मेरे लिए चाल है:

from sqlalchemy import create_engine
from sqlalchemy import MetaData, Table
from sqlalchemy.dialects import postgresql
from sqlalchemy.inspection import inspect

def upsert(engine, schema, table_name, records=[]):

    metadata = MetaData(schema=schema)
    metadata.bind = engine

    table = Table(table_name, metadata, schema=schema, autoload=True)

    # get list of fields making up primary key
    primary_keys = [key.name for key in inspect(table).primary_key]

    # assemble base statement
    stmt = postgresql.insert(table).values(records)

    # define dict of non-primary keys for updating
    update_dict = {
        c.name: c
        for c in stmt.excluded
        if not c.primary_key
    }

    # cover case when all columns in table comprise a primary key
    # in which case, upsert is identical to 'on conflict do nothing.
    if update_dict == {}:
        warnings.warn('no updateable columns found for table')
        # we still wanna insert without errors
        insert_ignore(table_name, records)
        return None


    # assemble new statement with 'on conflict do update' clause
    update_stmt = stmt.on_conflict_do_update(
        index_elements=primary_keys,
        set_=update_dict,
    )

    # execute
    with engine.connect() as conn:
        result = conn.execute(update_stmt)
        return result



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. चक्रीय संबंध के बिना ट्री टेबल कैसे बनाएं?

  2. Django ORM में postgresql विंडो फ़ंक्शंस का उपयोग करने का साफ तरीका?

  3. ActiveRecord - प्रत्येक समूह से पहले रिकॉर्ड का चयन करें

  4. द्वीपों में टाइमस्टैम्प कैसे समूहित करें (मनमाने ढंग से अंतर के आधार पर)?

  5. केवल पोस्टग्रेज में फंक्शन का बैकअप कैसे लें