【问题标题】:Using liquibase parameter inside loadData CSV在 loadData CSV 中使用 liquibase 参数
【发布时间】:2015-10-27 09:49:57
【问题描述】:

我想为每个 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 文件中使用参数和/或为什么默认值不符合我的要求?

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    我的工作方式与您描述的非常相似,所以我认为它可以帮助您,但使用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} 函数。

    我有一个 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 有效,并且我使用当前日期创建了用户。

    希望对你有帮助!

    【讨论】:

    • 基本上,必须从 loadData 中删除列并移动默认值以创建变更集并且它起作用了。
    【解决方案2】:

    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 中生成下表:

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

    在甲骨文中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 2019-11-11
      • 2018-12-30
      • 1970-01-01
      相关资源
      最近更新 更多