最初发布于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!
我想我没有正确配置命令...任何帮助,建议和/或命令行示例都可以帮助您。
奖励,
克里斯
答案 0 :(得分:0)
我认为您的命令中存在几个问题:
-e FLYWAY_PLACEHOLDERS_PREFIX="\${xxx"
应为FLYWAY_PLACEHOLDER_PREFIX
(无S),并且
-e FLYWAY_PLACEHOLDERS_XXXDBBASE=${base}
应为FLYWAY_PLACEHOLDERS_DBBASE
(由于XXX是前缀的一部分,因此不包含在占位符名称中;类似地,以下行也是如此)。