Flyway数据库迁移工具包含placeholder replacement的功能。
占位符的目的是什么?在什么样的实际场景中,占位符可能有用?你能描述一些简单的例子来证明有用吗?
this doc page底部的示例显示了在SQL中使用占位符。我们如何设置要插入的值代替占位符?是否将占位符的值的来源定义为环境变量,Java变量,Java .properties
file或其他内容?
占位符是否只包含纯文本,没有其他数据类型?
占位符只能在SQL文件中使用吗?可以在Java代码中的SQL字符串中使用占位符吗?
是否有其他可以使用占位符的地方?
我发现了这个问题,How do placeholders work in Flyway?,但它没有给我一个清晰的图片。
答案 0 :(得分:5)
占位符替换由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以获取配置Flyway的指南。
占位符是否只包含纯文本,没有其他数据类型?
只有字符串。 String placeholderValue = entry.getValue()
占位符只能在SQL文件中使用吗?可以在Java代码中的SQL字符串中使用占位符吗?
是的只是一个普通的SQL文件。我通过检查对PlaceholderReplacer
的引用来了解这一点,但它也有意义,因为Java迁移可能不包含SQL,并且它需要某种编译器插件才能工作。此外,Java迁移可以做任何事情,所以如果它想要使用与SQL脚本相同的占位符。只需编写Java来加载属性并进行字符串替换。如果你愿意,你甚至可以使用PlaceholderReplacer
。
是否有其他可以使用占位符的地方?
我在检查Flyway repo时没有找到任何内容。