Flyway数据库迁移中占位符的用途

Bas*_*que 1 java database-migration flyway property-placeholder

迁飞数据库迁移工具,包括一个功能占位符代替.

占位符的目的是什么?在什么样的实际场景中,占位符可能有用?你能描述一些简单的例子来证明有用吗?

此文档页面底部的示例显示了在SQL中使用占位符.我们如何设置要插入的值代替占位符?占位符值的来源是否定义为环境变量,Java变量,Java .properties文件或其他内容?

占位符是仅包含纯文本还是其他数据类型?

占位符只能在SQL文件中使用吗?可以在Java代码中的SQL字符串中使用占位符吗?

是否有其他可以使用占位符的地方?

我发现了这个问题,占位符如何在Flyway中运行?,但它没有给我一个清晰的图片.

Sam*_*uel 5

占位符替换由处理PlaceholderReplacer.

占位符的目的是什么?在什么样的实际场景中,占位符可能有用?你能描述一些简单的例子来证明有用吗?

假如我是一个可怜的启动与单个数据库和使用表前缀命名的每一个环境隔开dev,testprod.在我的Flyway迁移中,我可以选择${env}为此变量设置占位符.所以现在我可以使用占位符在所有环境中使用相同的迁移,并在运行时提供值.

假设我有一个迁移,它在数据库中创建只读用户和密码.在脚本中使用密码是不好的做法,因此使用占位符可以在运行时传递密码.

我们如何设置要插入的值代替占位符?

调用类configure()的实例Flyway将解析传递的属性中的占位符替换.它是这样的:

        Map<String, String> placeholdersFromProps = new HashMap<String, String>(placeholders);
        Iterator<Map.Entry<String, String>> iterator = props.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            String propertyName = entry.getKey();

            if (propertyName.startsWith(PLACEHOLDERS_PROPERTY_PREFIX)
                    && propertyName.length() > PLACEHOLDERS_PROPERTY_PREFIX.length()) {
                String placeholderName = propertyName.substring(PLACEHOLDERS_PROPERTY_PREFIX.length());
                String placeholderValue = entry.getValue();
                placeholdersFromProps.put(placeholderName, placeholderValue);
                iterator.remove();
            }
        }
        setPlaceholders(placeholdersFromProps);
Run Code Online (Sandbox Code Playgroud)

如果您使用的是CLI,请查看文档的配置部分以获取配置Flyway的指南.

占位符是仅包含纯文本还是其他数据类型?

只有字符串. String placeholderValue = entry.getValue()

占位符只能在SQL文件中使用吗?可以在Java代码中的SQL字符串中使用占位符吗?

是的只是一个普通的SQL文件.我通过检查引用来了解这一点PlaceholderReplacer,但它也有意义,因为Java迁移可能不包含SQL,并且需要某种编译器插件才能工作.此外,Java迁移可以做任何事情,所以如果它想要使用与SQL脚本相同的占位符.只需编写Java来加载属性并进行字符串替换.PlaceholderReplacer如果你愿意,你甚至可以使用.

是否有其他可以使用占位符的地方?

我在检查Flyway回购时没有找到任何东西.