sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan opsætter man pandas DataFrame til Microsoft SQL Server-tabel?

Der er to muligheder:

  1. Brug en FLET sætning i stedet for INSERT ... ON CONFLICT .
  2. Brug en OPDATERING sætning med en JOIN , efterfulgt af en betinget INSERT .

T-SQL-dokumentationen til MERGE siger:

Ydelsestip:Den betingede adfærd beskrevet for MERGE-sætningen fungerer bedst, når de to tabeller har en kompleks blanding af matchende karakteristika. For eksempel at indsætte en række, hvis den ikke findes, eller at opdatere en række, hvis den matcher. Når du blot opdaterer en tabel baseret på rækkerne i en anden tabel, skal du forbedre ydeevnen og skalerbarheden med grundlæggende INSERT-, UPDATE- og DELETE-sætninger.

I mange tilfælde er det hurtigere og mindre kompliceret blot at bruge den separate OPDATERING og INSERT udsagn.

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. Hvad skal jeg undslippe, når jeg sender en forespørgsel?

  2. Halloween-problemet – del 1

  3. Brug af flere PostgreSQL-skemaer med Rails-modeller

  4. xampp MySQL starter ikke