loadUpdateData始终插入整个CSV

时间:2016-09-27 13:52:25

标签: liquibase

我希望能够编辑CSV文件的内容,每次更改时,都会添加/修改/删除相应的记录。

使用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>

示例

档案的初始状态 - &gt;当表为空时插入的所有行:

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

添加了新行 - &gt;再次插入所有行

7,7

DB看起来像这样:

  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

3 个答案:

答案 0 :(得分:1)

愚蠢的是,intA未在其create table changelog中标记为主键。这解决了眼前的问题。如果检测到密钥冲突,它将更新值。

也就是说,如果我从CSV中删除一行,它就会保留在数据库中。我已经解决了这个问题,让Liquibsae总是截断表,然后运行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>

答案 1 :(得分:1)

您可以使用onlyUpdate =“ true”,它将在找到记录时进行更新,而在未找到记录时将忽略

答案 2 :(得分:0)

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