loadUpdateData 总是插入整个 CSV

loadUpdateData always inserting whole CSV

我希望能够编辑我的 CSV 文件的内容,每次更改时,适当的记录都是 added/modified/deleted。

结合使用 loadUpdateData 和 runOnChange="true",每次 CSV 发生变化时,整个 CSV 内容都会重新插入到数据库中,从而导致大量重复。

将 liquibase maven 插件 3.0.5 与 MySql 社区服务器 5.7

一起使用
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

<changeSet author="foobar" id="fizzbuzzDataLoad"  runOnChange="true">
    <loadUpdateData
            encoding="UTF-8"
            file="src/main/resources/liquibase/fizzbuzz.csv"
            quotchar=""
            separator=","
            primaryKey="ïntA"
            tableName="fizzbuzz">
        <column name="intA" type="NUMERIC"/>
        <column name="output" type="STRING"/>
    </loadUpdateData>
</changeSet>
</databaseChangeLog>

例子

文件的初始状态 --> table 为空时插入的所有行:

intA,Output
1,1
2,2
3,FIZZ
4,4
5,BUZZ
6,FIZZ

添加新行 --> 再次插入所有行

7,7

数据库看起来像这样:

  intA  Output
    1   1
    2   2
    3   FIZZ
    4   4
    5   BUZZ
    6   FIZZ
    1   1
    2   2
    3   FIZZ
    4   4
    5   BUZZ
    6   FIZZ
    7   7

loadUpdateData 的行为符合设计。 Liquibase 不支持检测表中数据的变化。

愚蠢的我,intA 在其创建 table 变更日志中未被标记为主键。这解决了眼前的问题。如果检测到键冲突,它将更新值。

就是说,如果我从 CSV 中删除一行,它会保留在数据库中。我通过让 Liquibsae 始终 t运行cate table 然后 运行 loadData 来解决这个问题,以插入所有新数据。

<changeSet author="fooBar" id="fizzbuzzDataClear"
        runAlways="true">
        <delete tableName="fizzBuzz">
        </delete>
    </changeSet>

    <changeSet author="fooBar" id="fizzbuzzDataLoad"
        runAlways="true">
        <loadUpdateData encoding="UTF-8"
            file="src/main/resources/liquibase/data/fizzbuzz.csv" quotchar=""
            separator="," primaryKey="ïntA" tableName="fizzbuzz">
            <column name="intA" type="NUMERIC" />
            <column name="output" type="STRING" />
        </loadUpdateData>
    </changeSet>

您可以使用 onlyUpdate="true",它会在找到记录时更新,如果找不到则忽略