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",它会在找到记录时更新,如果找不到则忽略
我希望能够编辑我的 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",它会在找到记录时更新,如果找不到则忽略