2017-05-30 38 views
1

Flyway数据库迁移工具包含一个用于placeholder replacement的功能。Flyway数据库迁移中占位符的用途

占位符的用途是什么?在什么样的现实世界的实际情况下占位符可能有用?你能描述一些简单的例子来证明有用吗?

this doc page底部的示例显示了在SQL中使用占位符。我们将如何设置插入值代替占位符?是占位符值的来源定义为环境变量,Java变量,Java .properties file,或其他?

占位符只占用纯文本,没有其他数据类型吗?

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

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

我发现了这个问题,How do placeholders work in Flyway?,但它并没有给我一个清晰的图片。

回答

4

占位符替换由PlaceholderReplacer处理。

占位符的用途是什么?在什么样的现实世界的实际情况下占位符可能有用?你能描述一些简单的例子来证明有用吗?

假如我是一个可怜的启动与单个数据库和使用表前缀每个命名devtestprod环境分开。在我的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时没有发现任何东西。