如何在flyway命令行中使用占位符前缀

时间:2019-07-04 14:15:33

标签: flyway

最初发布于https://github.com/flyway/flyway/issues/2429

我使用flyway占位符时遇到问题(可能是错误的配置);我可以将占位符用于自己的变量;但是它失败,因为sql查询中的cos one值的语法与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插件)

通过docker映像的命令行

您正在使用哪个数据库(类型和版本)?

MySQL Server version: 5.7.26 - MySQL Community Server (GPL)-这是一个旧项目

您正在使用哪个操作系统?

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

您做了什么?

((请包括引起问题的内容,任何相关的配置设置,失败的SQL语句(如果有)以及您运行的命令。)

我使用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), ...

我猜想https://flywaydb.org/documentation/commandline/info中描述的placeholderPrefix参数或https://flywaydb.org/documentation/envvars#FLYWAY_PLACEHOLDER_PREFIX中描述的FLYWAY_PLACEHOLDER_PREFIX环境变量就是为了这个目的;但是我没有成功使用它们!

这是我使用docker的命令:

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值;并且SQL代码中的${row}链保持不变。

您看到了什么?

飞行路线错误:

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!

我想我没有正确配置命令...任何帮助,建议和/或命令行示例都可以帮助您。

奖励,

克里斯

1 个答案:

答案 0 :(得分:0)

我认为您的命令中存在几个问题:

-e FLYWAY_PLACEHOLDERS_PREFIX="\${xxx"

应为FLYWAY_PLACEHOLDER_PREFIX(无S),并且

-e FLYWAY_PLACEHOLDERS_XXXDBBASE=${base}

应为FLYWAY_PLACEHOLDERS_DBBASE(由于XXX是前缀的一部分,因此不包含在占位符名称中;类似地,以下行也是如此)。