Flyway 数据库迁移中占位符的用途
Posted
技术标签:
【中文标题】Flyway 数据库迁移中占位符的用途【英文标题】:Purpose of placeholders in Flyway database migrations 【发布时间】:2017-10-30 08:45:57 【问题描述】:Flyway 数据库迁移工具包括placeholder replacement 的功能。
占位符的用途是什么?占位符在哪些现实世界的实际场景中可能有用?你能描述一些简单的例子来证明有用吗?
this doc page 底部的示例显示了在 SQL 中使用占位符。我们将如何设置要插入的值来代替该占位符?占位符值的来源是否定义为环境变量、Java 变量、Java .properties
file 或其他?
占位符是否只包含纯文本,不包含其他数据类型?
占位符只能在 SQL 文件中使用吗? Java 代码中的 SQL 字符串中可以使用占位符吗?
还有其他地方可以使用占位符吗?
我发现了这个问题,How do placeholders work in Flyway?,但它并没有给我一个清晰的画面。
【问题讨论】:
【参考方案1】:占位符替换由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 时没有发现任何东西。
【讨论】:
以上是关于Flyway 数据库迁移中占位符的用途的主要内容,如果未能解决你的问题,请参考以下文章