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

时间:2017-05-30 02:54:20

标签: java database-migration flyway property-placeholder

Flyway数据库迁移工具包含placeholder replacement的功能。

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

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

占位符是否只包含纯文本,没有其他数据类型?

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

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

我发现了这个问题,How do placeholders work in Flyway?,但它没有给我一个清晰的图片。

1 个答案:

答案 0 :(得分:5)

占位符替换由PlaceholderReplacer处理。

  

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

假设我是一个使用单个数据库的穷人,并使用表前缀来分隔名为devtestprod的每个环境。在我的Flyway迁移中,我可以选择为此变量设置占位符${env}。现在,我可以使用占位符在所有环境中使用相同的迁移,并在运行时提供值。

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

  

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

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

        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);

如果您使用的是CLI,请查看the configuration section of the docs以获取配置Flyway的指南。

  

占位符是否只包含纯文本,没有其他数据类型?

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

  

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

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

  

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

我在检查Flyway repo时没有找到任何内容。