sql >> Databasteknik >  >> RDS >> Sqlserver

Hur överför man pandas DataFrame till Microsoft SQL Server-tabellen?

Det finns två alternativ:

  1. Använd en MERGE sats istället för INSERT ... ON CONFLICT .
  2. Använd en UPDATE uttalande med en JOIN , följt av en villkorlig INSERT .

T-SQL-dokumentationen för MERGE säger:

Prestandatips:Det villkorliga beteendet som beskrivs för MERGE-satsen fungerar bäst när de två tabellerna har en komplex blandning av matchande egenskaper. Till exempel att infoga en rad om den inte finns, eller uppdatera en rad om den matchar. När du helt enkelt uppdaterar en tabell baserat på raderna i en annan tabell, förbättra prestandan och skalbarheten med grundläggande INSERT-, UPDATE- och DELETE-satser.

I många fall är det snabbare och mindre komplicerat att helt enkelt använda den separata UPDATE och INSERT uttalanden.

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. Fulltextsökning i Postgres eller CouchDB?

  2. Hur använder man % operator från tillägget pg_trgm?

  3. Hur man beräknar glidande medelvärde i MySQL

  4. Hur söker man efter snedstreck (\) i MySQL? och varför escape (\) krävs inte för var (=) men för Like krävs?