1

Flyway数据库迁移工具包括占位符替换功能。

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

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

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

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

还有其他地方可以使用占位符吗?

我发现了这个问题,占位符如何在 Flyway 中工作?,但它并没有给我一个清晰的画面。

4

1 回答 1

5

占位符替换由PlaceholderReplacer.

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

假设我是一个糟糕的初创公司,只有一个数据库,并使用表前缀来分隔名为devtest和的每个环境prod。在我的 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);

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

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

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

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

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

还有其他地方可以使用占位符吗?

我在检查Flyway 回购时没有发现任何东西。

于 2017-05-30T03:10:52.547 回答