【问题标题】:Kotlin Exposed batch insert not working as documentedKotlin Exposed 批量插入未按记录工作
【发布时间】:2019-08-22 14:56:49
【问题描述】:

我正在尝试使用 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)

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

【问题讨论】:

标签: kotlin-exposed


【解决方案1】:

文档解释:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2011-02-20
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多