Liquibase从csv加载数据

时间:2017-03-30 08:19:38

标签: java database liquibase

我想用来自csv文件的数据加载我的PostgreSql表的整个列但是当我这样做时,我得到一个异常,说我的表的主键不应该为null。看起来Liquibase正在创建新行来插入数据。有没有办法在现有行中加载数据?

DatabaseChangeLog dbChangeLog = new DatabaseChangeLog();
Liquibase liquibase = new Liquibase(dbChangeLog, new FileSystemResourceAccessor(), database);
ChangeSet loadChangeSet = new ChangeSet(id + "", "nasri", false, false, "", "", "", liquibase.getDatabaseChangeLog());

LoadDataChange loadDataChange = new LoadDataChange();
loadDataChange.setTableName(key);
loadDataChange.setChangeSet(loadChangeSet);
loadDataChange.setResourceAccessor(new FileSystemResourceAccessor());

String path = context.getBundle().getVersion() + "." + key + "." + columnKey + "." + targetFieldKey + ".csv";
loadDataChange.setFile(path);

loadDataChange.setSchemaName("public");

LoadDataColumnConfig columnConfig = new LoadDataColumnConfig();
columnConfig.setName(targetFieldKey);
columnConfig.setType("String");
loadDataChange.addColumn(columnConfig);
loadChangeSet.addChange(loadDataChange);
liquibase.getDatabaseChangeLog().addChangeSet(loadChangeSet);
liquibase.update("");

2 个答案:

答案 0 :(得分:1)

有一个叫做LoadUpdateDataChange

的课程

描述说:

  

将CSV文件中的数据加载或更新到现有表中。与loadData不同,它发出一个检查记录是否存在的SQL批处理。如果找到,则记录为UPDATEd,否则记录为INSERTed。另外,为回滚生成DELETE语句。

看起来它应该做你想要的(虽然我自己没有用过)。

答案 1 :(得分:0)

要更新记录,LoadUpdateDataChange对我不起作用。它总是尝试插入新记录,不会更新现有记录。

如果要更新现有记录,则应使用如下所示。

<update tableName="someTable">

   <column name="update_column_name" value="updated value" />

   <where> primaryKey = condition</where>

</update>