Пакетная вставка с таблицей, которая имеет много столбцов, используя Anorm
Я пытаюсь сделать пакетную вставку в таблицу базы данных MySQL, используя Anorm (в рамках игры 2.3.1). Приложение, которое я создаю, имеет стандартный веб-интерфейс в дополнение к требованию вставки пакетных данных, и я хотел бы попытаться сохранить логику в том же программном стеке.
Вставки идут только в те же несколько таблиц.
Количество строк, которые будут вставлены одновременно, достигнет сотен и может достигнуть тысяч, я ожидаю, что мне может понадобиться ограничить количество вставляемых строк в какой-то момент из-за ограничений anorm / mysql / other.
Драйвер MySQL, который я использую - это mysql-connector-java - 5.1.31
Ниже приведен сокращенный вариант использования.
Используя таблицу:
CREATE TABLE table1
(
col1 INTEGER NOT NULL,
col2 BIGINT,
col3 VARCHAR(255)
);
И скала код:
import play.api.Play.current
import play.api.db.DB
import anorm._
object TestInserts {
DB.withConnection("spo") { implicit conn =>
val theInserts = Seq(
Seq[NamedParameter]('val1 -> 1, 'val2 -> Some(1L), 'val3 -> Some("One"))
,Seq[NamedParameter]('val1 -> 2, 'val2 -> Some(2L), 'val3 -> Some("Two"))
,Seq[NamedParameter]('val1 -> 3, 'val2 -> Some(3L), 'val3 -> Some("Three"))
)
val insertBatchSQL = BatchSql( SQL("insert into table1 (col1, col2, col3) values ({val1}, {val2}, {val3})"), theInserts)
insertBatchSQL.execute
}
}
Я получаю следующую ошибку
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928)
at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3688)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3670)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3715)
at com.mysql.jdbc.PreparedStatement.setInt(PreparedStatement.java:3659)
at com.jolbox.bonecp.PreparedStatementHandle.setInt(PreparedStatementHandle.java:828)
at anorm.ToStatement$intToStatement$.set(ToStatement.scala:164)
at anorm.ToStatement$intToStatement$.set(ToStatement.scala:163)
...
Я посмотрел на тестовые классы в рамках игры, которые тестируют пакетную вставкуhttps://github.com/playframework/playframework/blob/master/framework/src/anorm/src/test/scala/anorm/BatchSqlSpec.scala и, насколько я могу судить, это должно работать так же.
Любые указатели о том, как это исправить или если я должен заняться этим по-другому, было бы замечательно.