Использование параметра liquibase внутри loadData CSV

Я хочу абстрагировать функции для генерации uuid для каждой dbms:

<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}"/>

..тоже не работает. Столбец идентификатора определен как NOT NULL, и если я оставлю столбец вне своего CSV, он жалуется, что столбцы не могут быть нулевыми, даже если он должен использовать значение по умолчанию.

Как мне использовать параметры в моих CSV-файлах и/или почему значение по умолчанию меня не устраивает?


person cen    schedule 27.10.2015    source источник


Ответы (2)


У меня это работает очень похоже на то, что вы описываете, поэтому я думаю, что это может вам помочь, но вместо этого с UUID, в моем случае это с Date, во всяком случае, тот же случай.

В моем журнале изменений у меня есть свойство для расчета текущей даты:

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

Затем у меня есть таблица пользователей, созданная с помощью этого набора изменений:

<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 работает, и я получаю пользователей, созданных с текущей датой.

Надеюсь, поможет!

person malaguna    schedule 27.10.2015
comment
По сути, пришлось удалить столбец из loadData и переместить значение по умолчанию, чтобы создать набор изменений, и это сработало. - person cen; 28.10.2015

type="COMPUTED" неправильно. Вам нужно использовать правильный тип данных, но поскольку тип данных для 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
);

и в Оракуле:

CREATE TABLE FOO
(
   ID  RAW(32)   DEFAULT sys_guid() NOT NULL
);
person a_horse_with_no_name    schedule 27.10.2015