占位符替换由PlaceholderReplacer
处理。
占位符的用途是什么?在什么样的现实世界的实际情况下占位符可能有用?你能描述一些简单的例子来证明有用吗?
假如我是一个可怜的启动与单个数据库和使用表前缀每个命名dev
,test
和prod
环境分开。在我的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在配置迁飞。
占位符只占用纯文本,没有其他数据类型吗?
只有字符串。 String placeholderValue = entry.getValue()
只能在SQL文件中使用占位符吗? Java代码中的SQL字符串中可以使用占位符吗?
是的只是一个普通的SQL文件。我从检查对PlaceholderReplacer
的引用中知道这一点,但它也是有道理的,因为Java迁移可能不包含SQL,并且它需要某种编译器插件才能工作。此外,Java迁移可以从字面上做任何事情,所以如果它想使用与SQL脚本相同的占位符。只需编写Java来加载属性并进行字符串替换。如果你愿意的话,你甚至可以使用PlaceholderReplacer
。
有没有其他地方可以使用占位符?
我在检查Flyway repo时没有发现任何东西。