Mysql
 sql >> база данни >  >> RDS >> Mysql

Пакетно вмъкване с таблица, която има много колони, използвайки Anorm

Ще отида с опция Б. Не съм много запознат с BatchSql тъй като последно проверих, той просто изпълнява последователно зареждане от заявки, което е ужасно бавно. Бих препоръчал да обедините всичко в една заявка. Малко по-досадно, но много по-бързо е да изпълните една заявка с хиляда вмъквания, отколкото хиляда единични вмъквания.

За удобство да приемем, че имате Seq от

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

След това можете да създадете вашата заявка по следния начин:

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()

Бележки:

Ще трябва да проверите тези values не е празен, преди да продължи, тъй като би генерирал невалиден SQL оператор, ако беше.

В зависимост от това колко реда и колони вмъквате, в крайна сметка анализаторите на токени, които са създали подготвения израз, ще се забавят от огромното количество токени за анализ (и размера на низа). Забелязах това след няколкостотин реда с няколко колони. Това може да бъде смекчено донякъде. Благодарение на това, че Scala е строго типизиран език, Int и Long не представлява заплаха за SQL инжектиране. Можете да подготвите вашите SQL изрази, като използвате интерполация/конкатенация на низове само за тези колони и да свържете опасните колони с NamedParameter нормално. Това ще намали броя на токените, които трябва да бъдат анализирани.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Трябва ли да съхранявам цената като десетична или цяло число в Mysql?

  2. Mysql заявки - използване на join/union и др

  3. Как да посочите родителското поле на заявка от подзаявка в MySQL?

  4. Полиморфна структура на таблицата на базата данни на SQL

  5. mysql показва Брой редове от друга таблица във всеки ред