在 loadData CSV 中使用 liquibase 参数
Using liquibase parameter inside loadData CSV
我想为每个 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 文件中使用参数and/or为什么默认值让我失望?
我的工作原理与你描述的非常相似,所以我认为它可以帮助你,但不是 UUID
,在我的情况下它是 Date
,无论如何,同样的情况。
在我的更新日志中,我有一个 属性 来计算当前日期:
<property name="now" value="CURRENT_DATE" dbms="hsqldb" />
然后,我有一个用户 table 是用这个 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
列不为空,它具有 ${now}
函数的 defaultValueComputed
属性。
我有一个创建测试用户的 users.csv
文件 (usuarios-test.csv
):
login;oid;nombre;apellidos;activo
user;b776052e-7c9f-11e5-8584-67d602646e6f;Prueba;Prueba;true
如您所见,在 csv 文件中我使用了 headers 行并且不包含 fecha
字段。 (在我的例子中,UUID
是 pre-generated,但我可以像你一样更改它)。
我终于有了这个 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
有效并且我使用当前日期创建了用户。
希望对您有所帮助!
type="COMPUTED"
是错误的。您需要使用正确的数据类型,但由于 UUID 的数据类型在 DBMS 之间是不同的,因此您还需要为此创建一个 属性。
以下在 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 中生成以下 table:
CREATE TABLE foo
(
id uuid DEFAULT gen_random_uuid() NOT NULL
);
在 Oracle 中:
CREATE TABLE FOO
(
ID RAW(32) DEFAULT sys_guid() NOT NULL
);
我想为每个 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 文件中使用参数and/or为什么默认值让我失望?
我的工作原理与你描述的非常相似,所以我认为它可以帮助你,但不是 UUID
,在我的情况下它是 Date
,无论如何,同样的情况。
在我的更新日志中,我有一个 属性 来计算当前日期:
<property name="now" value="CURRENT_DATE" dbms="hsqldb" />
然后,我有一个用户 table 是用这个 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
列不为空,它具有 ${now}
函数的 defaultValueComputed
属性。
我有一个创建测试用户的 users.csv
文件 (usuarios-test.csv
):
login;oid;nombre;apellidos;activo
user;b776052e-7c9f-11e5-8584-67d602646e6f;Prueba;Prueba;true
如您所见,在 csv 文件中我使用了 headers 行并且不包含 fecha
字段。 (在我的例子中,UUID
是 pre-generated,但我可以像你一样更改它)。
我终于有了这个 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
有效并且我使用当前日期创建了用户。
希望对您有所帮助!
type="COMPUTED"
是错误的。您需要使用正确的数据类型,但由于 UUID 的数据类型在 DBMS 之间是不同的,因此您还需要为此创建一个 属性。
以下在 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 中生成以下 table:
CREATE TABLE foo
(
id uuid DEFAULT gen_random_uuid() NOT NULL
);
在 Oracle 中:
CREATE TABLE FOO
(
ID RAW(32) DEFAULT sys_guid() NOT NULL
);