占位符替换由PlaceholderReplacer
.
占位符的目的是什么?占位符在哪些现实世界的实际场景中可能有用?你能描述一些简单的例子来证明有用吗?
假设我是一个糟糕的初创公司,只有一个数据库,并使用表前缀来分隔名为dev
、test
和的每个环境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 回购时没有发现任何东西。