我想抽象为每个 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 文件中使用参数和/或为什么默认值让我失败?
我让它的工作方式与您所描述的非常相似,所以我认为它可以帮助您,但是使用 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可以工作,并且我可以使用当前日期创建用户。
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
8494 次 |
| 最近记录: |