Как использовать префикс заполнителей в командной строке flyway - PullRequest
0 голосов
/ 04 июля 2019

Первоначально опубликовано в https://github.com/flyway/flyway/issues/2429

У меня проблема (возможно, неправильная конфигурация) с использованием заполнителей пролетных путей;Я могу использовать заполнители для своих собственных переменных;но он терпит неудачу, потому что одно значение в запросе sql имеет синтаксис, аналогичный синтаксису заполнителя flyway.

Какую версию и версию Flyway вы используете?

5.2.4 using official docker image

Если это не последняя версия, можете ли вы воспроизвести проблему и с самой последней? (Многие ошибки исправляются в более новых выпусках, и обновление часто решает проблему)

5.2.4 - это последняя версия в Docker Hub (https://hub.docker.com/r/boxfuse/flyway/)

Какой клиент вы используете? (Командная строка, Java API, плагин Maven, плагин Gradle)

Командная строка через образ докера

Какую базу данных вы используете (тип и версия)?

MySQL Server version: 5.7.26 - MySQL Community Server (GPL) - Это наследиеproject

Какую операционную систему вы используете?

Linux CentOS 7 x64 (uname -r = 3.10.0-957.5.1.el7.x86_64)

Что вы делалиdo?

(Пожалуйста, включите содержимое, вызывающее проблему, любые соответствующие параметры конфигурации, оператор SQL, который не выполнен (еслиvant) и команду, которую вы выполнили.)

Я применяю flyway для инициализации / обновления базы данных MySQL;Вот пара команд SQL.

Здесь я использую заполнители с префиксами xxx:

CREATE USER IF NOT EXISTS '${xxxdbuser}'@'${xxxdbclip}' IDENTIFIED WITH mysql_native_password BY '${xxxdbpass}';
GRANT ALL PRIVILEGES ON ${xxxdbbase}.* TO '${xxxdbuser}'@'${xxxdbclip}';
FLUSH PRIVILEGES;

... затем в другом скрипте SQL из стороннего приложения я вставляю содержимое с${row}.Я не хочу, чтобы Flyway интерпретировал ${row} как заполнитель, только мои собственные переменные, начинающиеся с ${xxx, такие как ${xxxdbuser}

INSERT INTO `xxx_xxx` (`name`, `template`, `lang`, `group`, `version`, `data`, `size`, `style`, `modified`) VALUES
... ('addressbook.email.rows', '', '', 0, '1.3.001', 'a:1:{i:0;a:6:{ ... \"label\";s:21:\"$row_cont[type_label]\";s:4:\"name\";s:12:\"${row}[type]\";s:5:\"align\";... :{i:0;s:4:\"100%\";}}}', '100%', '', 1150326789), ...

Я предполагаю, что параметр placeholderPrefix описан в https://flywaydb.org/documentation/commandline/info или FLYWAY_PLACEHOLDER_PREFIX env var, описанный в https://flywaydb.org/documentation/envvars#FLYWAY_PLACEHOLDER_PREFIX, предназначен для этой цели;но мне не удалось их использовать!

Вот моя команда, использующая докер:

docker run --rm --network="$(docker network ls --filter name=app_mysql_dev --filter "label=type=app" --format '{{.ID}}')" \
    -v `pwd`/code/Admin/install:/flyway/sql \
    -e FLYWAY_URL=jdbc:mysql://${host}:${port}?useSSL=false \
    -e FLYWAY_SCHEMAS=${base} \
    -e FLYWAY_USER=root \
    -e FLYWAY_PASSWORD=${root_pwd} \
    -e FLYWAY_PLACEHOLDERS_PREFIX="\${xxx" \
    -e FLYWAY_PLACEHOLDERS_XXXDBBASE=${base} \
    -e FLYWAY_PLACEHOLDERS_XXXDBUSER=${user} \
    -e FLYWAY_PLACEHOLDERS_XXXDBPASS=${pass} \
    -e FLYWAY_PLACEHOLDERS_XXXDBCLIP=${clip} \
    -e FLYWAY_PLACEHOLDERS_XXXVHOST=${vhost} \
    -e FLYWAY_PLACEHOLDERS_XXXSCHEME=${scheme} \
    -e FLYWAY_CONNECT_RETRIES=5 \
    boxfuse/flyway:5.2.4 -locations=filesystem:/flyway/sql/custom/ \
    migrate

Что вы ожидали увидеть?

Все ${xxx заполнители должны быть заменены соответствующими значениями ENV;и ${row} цепочка в коде SQL остается неизменной.

Что вы видели вместо этого?

Ошибка пролетного пути:

Flyway Community Edition 5.2.4 by Boxfuse
Database: jdbc:mysql://tasks.atlas-mysql:3306 (MySQL 5.7)
ERROR: No value provided for placeholder expressions: ${row}.  Check your configuration!

Я полагаюЯ неправильно сконфигурировал свою команду ... любой пример помощи, совета и / или командной строки помог бы.

Regrads,

Chris

1 Ответ

0 голосов
/ 08 июля 2019

Я думаю, что в вашей команде есть пара проблем:

-e FLYWAY_PLACEHOLDERS_PREFIX="\${xxx"

должно быть FLYWAY_PLACEHOLDER_PREFIX (без S) и

-e FLYWAY_PLACEHOLDERS_XXXDBBASE=${base}

должно быть FLYWAY_PLACEHOLDERS_DBBASE (так как XXX является частью префикса, он не включен в имя заполнителя и аналогично для следующих строк).

...