2017-05-30 98 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時沒有發現任何東西。