如何在 flyway 命令行中使用占位符前缀
How to use placeholders prefix in flyway command line
最初发布于https://github.com/flyway/flyway/issues/2429
我在使用飞路占位符时遇到问题(可能是配置错误);我可以为自己的变量使用占位符;但它失败了,因为 sql 查询中的一个值具有与 flyway 占位符语法相似的语法。
您使用的是哪个版本的Flyway?
5.2.4 using official docker image
如果这不是最新版本,你能用最新版本重现这个问题吗?(许多错误在新版本中修复,升级通常会解决问题)
5.2.4
标记是 docker 中心 (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 应用于 initialize/update 一个 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 or FLYWAY_PLACEHOLDER_PREFIX env var described into https://flywaydb.org/documentation/envvars#FLYWAY_PLACEHOLDER_PREFIX 中描述的 placeholderPrefix 参数就是为了这个目的;但是我没有成功使用它们!
这是我使用 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!
我想我没有正确配置我的命令...任何帮助,建议 and/or 命令行示例会有所帮助。
注册,
克里斯
我认为你的命令有几个问题:
-e FLYWAY_PLACEHOLDERS_PREFIX="${xxx"
应该是FLYWAY_PLACEHOLDER_PREFIX
(没有S),
-e FLYWAY_PLACEHOLDERS_XXXDBBASE=${base}
应该是 FLYWAY_PLACEHOLDERS_DBBASE
(因为 XXX 是前缀的一部分,它不包含在占位符名称中;类似地用于以下行)。
最初发布于https://github.com/flyway/flyway/issues/2429
我在使用飞路占位符时遇到问题(可能是配置错误);我可以为自己的变量使用占位符;但它失败了,因为 sql 查询中的一个值具有与 flyway 占位符语法相似的语法。
您使用的是哪个版本的Flyway?
5.2.4 using official docker image
如果这不是最新版本,你能用最新版本重现这个问题吗?(许多错误在新版本中修复,升级通常会解决问题)
5.2.4
标记是 docker 中心 (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 应用于 initialize/update 一个 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 or FLYWAY_PLACEHOLDER_PREFIX env var described into https://flywaydb.org/documentation/envvars#FLYWAY_PLACEHOLDER_PREFIX 中描述的 placeholderPrefix 参数就是为了这个目的;但是我没有成功使用它们!
这是我使用 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!
我想我没有正确配置我的命令...任何帮助,建议 and/or 命令行示例会有所帮助。
注册,
克里斯
我认为你的命令有几个问题:
-e FLYWAY_PLACEHOLDERS_PREFIX="${xxx"
应该是FLYWAY_PLACEHOLDER_PREFIX
(没有S),
-e FLYWAY_PLACEHOLDERS_XXXDBBASE=${base}
应该是 FLYWAY_PLACEHOLDERS_DBBASE
(因为 XXX 是前缀的一部分,它不包含在占位符名称中;类似地用于以下行)。