Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana cara memasukkan pandas DataFrame ke tabel Microsoft SQL Server?

Ada dua opsi:

  1. Gunakan MERGE pernyataan alih-alih INSERT ... ON CONFLICT .
  2. Gunakan UPDATE pernyataan dengan JOIN , diikuti dengan INSERT bersyarat .

Dokumentasi T-SQL untuk MERGE mengatakan:

Kiat Kinerja:Perilaku bersyarat yang dijelaskan untuk pernyataan MERGE berfungsi paling baik ketika dua tabel memiliki campuran kompleks dari karakteristik yang cocok. Misalnya, menyisipkan baris jika tidak ada, atau memperbarui baris jika cocok. Saat hanya memperbarui satu tabel berdasarkan baris tabel lain, tingkatkan kinerja dan skalabilitas dengan pernyataan dasar INSERT, UPDATE, dan DELETE.

Dalam banyak kasus, lebih cepat dan lebih mudah untuk menggunakan UPDATE yang terpisah dan INSERT pernyataan.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konversi 'smalldatetime' menjadi 'datetime' di SQL Server (Contoh T-SQL)

  2. Bagaimana saya bisa mendapatkan jumlah beberapa nilai datetime?

  3. Kesalahan JDBC SQL Server di Java 8:Pengandar tidak dapat membuat sambungan aman ke SQL Server dengan menggunakan enkripsi Secure Sockets Layer (SSL)

  4. 3 Cara Mengembalikan Baris yang Mengandung Karakter Alfanumerik di SQL Server

  5. @@ERROR dan/atau COBA - CATCH