如何在 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 是前缀的一部分,它不包含在占位符名称中;类似地用于以下行)。