sql >> Databáze >  >> RDS >> Sqlserver

Jak vložit pandas DataFrame do tabulky Microsoft SQL Server?

Existují dvě možnosti:

  1. Použijte MERGE místo INSERT ... ON CONFLICT .
  2. Použijte UPDATE příkaz s JOIN , následovaný podmíněným INSERT .

Dokumentace T-SQL pro MERGE říká:

Tip pro výkon:Podmíněné chování popsané pro příkaz MERGE funguje nejlépe, když mají dvě tabulky komplexní kombinaci shodných charakteristik. Například vložení řádku, pokud neexistuje, nebo aktualizaci řádku, pokud se shoduje. Když jednoduše aktualizujete jednu tabulku na základě řádků jiné tabulky, zvyšte výkon a škálovatelnost pomocí základních příkazů INSERT, UPDATE a DELETE.

V mnoha případech je rychlejší a méně komplikované jednoduše použít samostatný UPDATE a INSERT prohlášení.

engine = sa.create_engine(
    connection_uri, fast_executemany=True, isolation_level="SERIALIZABLE"
)

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 - upload DataFrame to temporary table
    df.to_sql("#temp_table", conn, index=False, if_exists="replace")

    # step 2 - merge temp_table into main_table
    conn.execute(
        sa.text("""\
            UPDATE main SET main.txt = temp.txt
            FROM main_table main INNER JOIN #temp_table temp
                ON main.id = temp.id
            """
        )
    )
    conn.execute(
        sa.text("""\
            INSERT INTO main_table (id, txt) 
            SELECT id, txt FROM #temp_table
            WHERE id NOT IN (SELECT id FROM main_table) 
            """
        )
    )

    # 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. Jak najít duplicitní hodnoty v tabulce SQL

  2. Oracle- Rozdělit řetězec oddělený čárkou (řetězec obsahuje mezery a po sobě jdoucí čárky)

  3. Jak uniknout z jediné citace, speciálních znaků v MySQL

  4. Přidání kroku úlohy do existující úlohy agenta SQL Server (T-SQL)