【问题标题】:Liquibase loading data from csvLiquibase 从 csv 加载数据
【发布时间】:2019-09-24 17:52:21
【问题描述】:

我想用 csv 文件中的数据加载我的 PostgreSql 表的整个列,但是当我这样做时,我得到一个异常,说我的表的主键不应该为空。看起来 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("");

【问题讨论】:

    标签: java database liquibase


    【解决方案1】:

    有一个类叫:LoadUpdateDataChange

    描述说:

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

    看起来它应该可以满足您的需求(虽然我自己没有使用过)。

    【讨论】:

      【解决方案2】:

      要更新记录,LoadUpdateDataChange 不适合我。它总是试图插入新记录。它不会更新现有记录。

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

      <update tableName="someTable">
      
         <column name="update_column_name" value="updated value" />
      
         <where> primaryKey = condition</where>
      
      </update>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-01
        • 2021-05-07
        • 2019-09-04
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        相关资源
        最近更新 更多