Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Sisipan batch dengan tabel yang memiliki banyak kolom menggunakan Anorm

Saya akan memilih opsi B. Saya tidak terlalu paham dengan BatchSql sejak terakhir saya memeriksanya, itu hanya menjalankan banyak pertanyaan secara berurutan, yang sangat lambat. Saya akan merekomendasikan menggabungkan semuanya menjadi satu kueri. Ini sedikit lebih membosankan, tetapi jauh lebih cepat untuk mengeksekusi satu kueri dengan seribu sisipan daripada seribu sisipan tunggal.

Untuk kenyamanan, katakanlah Anda memiliki Seq dari

case class Test(val1: Int, val2: Option[Long], val3: Option[String])

Kemudian Anda dapat membuat kueri seperti ini:

val values: Seq[Test] = Seq(....)

/* Index your sequence for later, to map to inserts and parameters alike */
val indexedValues = values.zipWithIndex

/* Create the portion of the insert statement with placeholders, each with a unique index */
val rows = indexValues.map{ case (value, i) =>
    s"({val1_${i}}, {val2_${i}}, {val3_${i}})"
}.mkString(",")

/* Create the NamedParameters for each `value` in the sequence, each with their unique index in the token, and flatten them together */
val parameters = indexedValues.flatMap{ case(value, i) =>
    Seq(
        NamedParameter(s"val1_${i}" -> value.val1),
        NamedParameter(s"val2_${i}" -> value.val2),
        NamedParameter(s"val3_${i}" -> value.val3)
    ) 
}

/* Execute the insert statement, applying the aggregated parameters */
SQL("INSERT INTO table1 (col1, col2, col3) VALUES " + rows)
    .on(parameters: _ *)
    .executeInsert()

Catatan:

Anda harus memeriksa bahwa values tidak kosong sebelum melanjutkan, karena akan menghasilkan pernyataan SQL yang tidak valid jika kosong.

Bergantung pada berapa banyak baris dan kolom yang Anda masukkan, pada akhirnya pengurai token yang membuat pernyataan yang disiapkan akan melambat dari jumlah token yang akan diurai (dan ukuran string). Saya perhatikan ini setelah beberapa ratus baris dengan beberapa kolom. Ini bisa sedikit dikurangi. Berkat Scala menjadi bahasa yang diketik dengan kuat, Int dan Long tidak menimbulkan ancaman untuk injeksi SQL. Anda dapat menyiapkan pernyataan SQL menggunakan interpolasi/penggabungan string hanya untuk kolom tersebut dan mengikat kolom yang tidak aman dengan NamedParameter biasanya. Itu akan mengurangi jumlah token yang perlu diuraikan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Indeks pada kunci utama dan asing

  2. Ekspor tabel mysql ke CSV menggunakan kode PHP

  3. Dapatkan interval waktu di mysql

  4. Bagaimana cara membaca kolom dan sel tertentu di mysql di c #?

  5. qt 5.8 kesalahan koneksi sql:driver QMYSQL tidak dimuat di windows 10