Как передать переменную в команде liquibase SQL? - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь выполнить простую команду sql (posgre sql DB) с использованием liquibase перед запуском docker. Вот мой скрипт liquibase "email-reset. xml", который не работает, поскольку я использую переменную (работает жестко закодированное значение)

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                                       http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
                                       http://www.liquibase.org/xml/ns/dbchangelog-ext
                                       http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
    <changeSet id="email-reset" author="keanu">
        <comment>Update User Emails in Dev</comment>
        <sql>
            update cwd_user set email_address='${email.reset}';
        </sql>
    </changeSet>
</databaseChangeLog>

У меня есть файл liquibase.properties, где я определил

parameter.email.reset=${OVERWRITE_USER_EMAIL}

В файле docker, который я пишу,

ENV OVERWRITE_USER_EMAIL false

Я хочу, чтобы электронное письмо в базе данных было перезаписано, если в моем файле docker указано значение.

OVERWRITE_USER_EMAIL=user@example.com

Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Если вы правильно поняли ваш вопрос,

  1. Используя параметры журнала изменений , вы можете передать значение процессу обновления Liquibase.
  2. С помощью changeLogPropertyDefined предварительное условие можно проверить, определен ли параметр журнала изменений.
  3. Вместо простого SQL, если вы используете обновление изменения , где вы можете передать значение параметра в value атрибут столбца
<changeSet id="email-reset" author="keanu">
   <update>
      <column name='email_address' value='${email.reset}'/>
   </update >
</changeSet>

Я надеюсь, что смогу помочь.

0 голосов
/ 31 января 2020

Во-первых, вам не следует добавлять префикс parameter в имя вашего свойства. Просто укажите email.reset=some_actual_value.

Во-вторых, у вас не может быть «двойной косвенности», которую вы используете в своем примере, когда вы указываете значение переменной среды в файле свойств. В системе нет ничего, чтобы выполнить эту замену.

Если вы хотите, чтобы в вашем dockerfile было что-то, управляющее значением email.reset, было бы лучше не использовать файл свойств, а вместо этого передать свойство как системное свойство в командной строке, чтобы команда liquibase run выглядит примерно так:

./liquibase -Demail.reset=true update

Если значение email.reset все равно жестко запрограммировано в dockerfile, нет необходимости устанавливать переменную окружения просто для ее использования в одном place.

Наконец, использование Liquibase для задач, которые, по сути, являются задачами системного администратора, вероятно, не лучший способ решения этой задачи. Было бы лучше, если бы в самом приложении было что-то, что можно было бы использовать после запуска приложения. Liquibase - это инструмент для управления изменениями схемы, а не то, что следует использовать для управления данными приложения.

...