在 loadData CSV 中使用 liquibase 参数

cen*_*cen 5 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"/>
Run Code Online (Sandbox Code Playgroud)

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

"${uuid_function}"
Run Code Online (Sandbox Code Playgroud)

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

<column name="id" type="COMPUTED" defaultValueComputed="${uuid_function}"/>
Run Code Online (Sandbox Code Playgroud)

..也不起作用。Id 列被定义为 NOT NULL,如果我将该列保留在 CSV 之外,它会抱怨列不能为空,即使它应该使用默认值。

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

mal*_*una 3

我让它的工作方式与您所描述的非常相似,所以我认为它可以帮助您,但是使用 a UUID,在我的情况下,它是使用 a Date,无论如何,相同的情况。

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

<property name="now" value="CURRENT_DATE" dbms="hsqldb" />
Run Code Online (Sandbox Code Playgroud)

然后,我有一个使用此更改集创建的用户表:

<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>
Run Code Online (Sandbox Code Playgroud)

如您所见,fecha列不为空,并且具有功能defaultValueComputed属性${now}

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

login;oid;nombre;apellidos;activo
user;b776052e-7c9f-11e5-8584-67d602646e6f;Prueba;Prueba;true
Run Code Online (Sandbox Code Playgroud)

如您所见,在 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>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我声明了.csv文件中存在的所有列,但fecha不包括在内,因此defaultValueComputed可以工作,并且我可以使用当前日期创建用户。

希望能帮助到你!