我希望能够编辑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
答案 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不支持检测表中数据的变化。