5

我正在尝试使用 Kotlin Exposed 将记录批量插入到 SQL 表中。我已经根据 Exposed 文档设置了代码,但是,正在执行的 SQL 语句是单独的插入语句而不是 1 个批量插入语句。

位于此处的文档:https ://github.com/JetBrains/Exposed/wiki/DSL 在批量插入上有以下内容:

批量插入

批量插入允许在一个 sql 语句中将实体列表映射到数据库原始数据。它比一个一个插入更有效,因为它只启动一个语句。这是一个例子:

    val cityNames = listOf("Paris", "Moscow", "Helsinki")
    val allCitiesID = cities.batchInsert(cityNames) { name ->
      this[cities.name] = name
    }

我的代码如下:

    val mappings: List<Triple<String, String, String>> = listOf(triple1, triple2, triple3)
    transaction {
        TableName.batchInsert(mappings) {
            this[TableName.value1] = it.first
            this[TableName.value2] = it.second
            this[TableName.value3] = it.third
        }
    }

我希望看到打印出来的是 1 个批处理插入语句,它遵循以下语法

INSERT INTO TableName (value1, value2, value3) values
(triple1value1, triple1value2, triple1value3),
(triple2value1, triple2value2, triple2value3),
(triple3value1, triple3value2, triple3value3), ...

但它使用以下语法打印 3 个单独的插入语句

INSERT INTO TableName (value1, value2, value3) values (triple1value1, triple1value2, triple1value3)
INSERT INTO TableName (value1, value2, value3) values (triple2value1, triple2value2, triple2value3)
INSERT INTO TableName (value1, value2, value3) values (triple3value1, triple3value2, triple3value3)

由于这似乎是记录在案的正确批量插入方法,我在这里做错了什么?

4

1 回答 1

3

文档解释:

注意:batchInsert 函数在与数据库交互时仍会创建多个 INSERT 语句。您很可能希望将此与相关 JDBC 驱动程序的 rewriteBatchedInserts=true(或 rewriteBatchedStatements=true)选项结合使用,这会将它们转换为单个 bulkInsert。您可以在此处找到 MySQL 和 PostgreSQL 的此选项的文档。

https://github.com/JetBrains/Exposed/wiki/DSL#batch-insert

于 2020-11-25T14:01:46.967 回答