在loadData CSV中使用liquibase参数

时间:2015-10-27 09:49:57

标签: liquibase

我想抽象为每个dbms生成uuid的函数:

<property name="uuid_function" value="gen_random_uuid()" dbms="postgresql"/>
<property name="uuid_function" value="NEWID()" dbms="mssql"/>
<property name="uuid_function" value="sys_guid()" dbms="oracle"/>

然后在我的CSV中使用此属性,由loadData加载,如下所示:

"${uuid_function}"

但它不起作用($解析错误)。另一种方法是在loadData内的列上使用默认值:

<column name="id" type="COMPUTED" defaultValueComputed="${uuid_function}"/>

..也不起作用。 Id列被定义为NOT NULL,如果我将列从CSV中删除,它会抱怨列不能为空,即使它应该使用默认值。

如何在CSV文件中使用参数和/或为什么默认值使我失败?

2 个答案:

答案 0 :(得分:3)

我的工作与你描述的非常相似,所以我认为它可以帮到你,但是我只能使用UUID来代替Date,无论如何,同样的情况

在我的更新日志中,我有一个属性来计算当前日期:

<property name="now" value="CURRENT_DATE" dbms="hsqldb" />

然后,我有一个用这个changeSet创建的用户表:

<changeSet author="miguel" id="1448735850226-1">
    <createTable tableName="usuario">
        <column name="login" type="VARCHAR(255)">
            <constraints nullable="false"/>
        </column>
        <column name="oid" type="VARCHAR(255)"/>
        <column name="fecha" type="date" defaultValueComputed="${now}">
            <constraints nullable="false"/>
        </column>
        <column name="nombre" type="VARCHAR(255)"/>
        <column name="apellidos" type="VARCHAR(255)"/>
        <column name="activo" type="BOOLEAN"/>
    </createTable>
</changeSet>

如您所见,fecha列不为空,且defaultValueComputed属性为${now}。{/ p>

我有一个users.csv文件,用于创建测试用户(usuarios-test.csv):

login;oid;nombre;apellidos;activo
user;b776052e-7c9f-11e5-8584-67d602646e6f;Prueba;Prueba;true

正如您所看到的,在csv文件中我使用了标题行,而我不包含fecha字段。 (在我的情况下,UUID是预先生成的,但我可以随时更改)。

最后我有loadData更改

<changeSet author="miguel" id="1448735850226-16">
    <loadData tableName="usuario" encoding="UTF-8" 
      file="src/main/resources/liquibase/changelogs/usuarios-test.csv"
      quotchar="'" separator=";" >
      <column header="login" name="login" type="STRING"/>
      <column header="oid" name="oid" type="STRING"/>
      <column header="nombre" name="nombre" type="STRING"/>
      <column header="apellidos" name="apellidos" type="STRING"/>
      <column header="activo" name="activo" type="BOOLEAN"/>
    </loadData>
</changeSet>

正如您所看到的,我声明所有列都显示在.csv文件中并且fecha未包含在内,因此defaultValueComputed可以正常工作,并且我会使用当前日期创建用户。

希望它有所帮助!

答案 1 :(得分:2)

type="COMPUTED"错了。您需要使用正确的数据类型,但由于DBMS之间UUID的数据类型不同,您还需要为其创建属性。

以下适用于Oracle和Postgres:

  <property name="uuid_function" value="gen_random_uuid()" dbms="postgresql"/>
  <property name="uuid_function" value="NEWID()" dbms="mssql"/>
  <property name="uuid_function" value="sys_guid()" dbms="oracle"/>

  <property name="uuid_type" value="uuid" dbms="postgresql"/>
  <property name="uuid_type" value="uniqueidentifier" dbms="mssql"/>
  <property name="uuid_type" value="RAW(32)" dbms="oracle"/>

  <changeSet author="testing" id="1">
    <createTable tableName="foo">
      <column name="id" type="${uuid_type}" defaultValueComputed="${uuid_function}">
        <constraints nullable="false"/>
      </column>
    </createTable>
  </changeSet>

这会在Postgres中生成下表:

CREATE TABLE foo
(
   id  uuid    DEFAULT gen_random_uuid() NOT NULL
);

并在Oracle中:

CREATE TABLE FOO
(
   ID  RAW(32)   DEFAULT sys_guid() NOT NULL
);