sql >> Database >  >> RDS >> PostgreSQL

Hoe panda's DataFrame upsert naar PostgreSQL-tabel?

Als u PostgreSQL 9.5 of hoger gebruikt, kunt u de UPSERT uitvoeren met een tijdelijke tabel en een INSERT ... ON CONFLICT verklaring:

import sqlalchemy as sa

# …

with engine.begin() as conn:
    # step 0.0 - create test environment
    conn.execute(sa.text("DROP TABLE IF EXISTS main_table"))
    conn.execute(
        sa.text(
            "CREATE TABLE main_table (id int primary key, txt varchar(50))"
        )
    )
    conn.execute(
        sa.text(
            "INSERT INTO main_table (id, txt) VALUES (1, 'row 1 old text')"
        )
    )
    # step 0.1 - create DataFrame to UPSERT
    df = pd.DataFrame(
        [(2, "new row 2 text"), (1, "row 1 new text")], columns=["id", "txt"]
    )
    
    # step 1 - create temporary table and upload DataFrame
    conn.execute(
        sa.text(
            "CREATE TEMPORARY TABLE temp_table (id int primary key, txt varchar(50))"
        )
    )
    df.to_sql("temp_table", conn, index=False, if_exists="append")

    # step 2 - merge temp_table into main_table
    conn.execute(
        sa.text("""\
            INSERT INTO main_table (id, txt) 
            SELECT id, txt FROM temp_table
            ON CONFLICT (id) DO
                UPDATE SET txt = EXCLUDED.txt
            """
        )
    )

    # step 3 - confirm results
    result = conn.execute(sa.text("SELECT * FROM main_table ORDER BY id")).fetchall()
    print(result)  # [(1, 'row 1 new text'), (2, 'new row 2 text')]


  1. ASP Classic SQL Query-foutbericht, juiste syntaxis alstublieft

  2. Hoe de huidige waarde van een orakelreeks op te halen zonder deze te verhogen?

  3. ORA - 00933 verwarring met inner join en as

  4. Resultaten bestellen van gretig geladen geneste modellen in Node Sequelize