Java Flyway数据库迁移中占位符的用途

Java Flyway数据库迁移中占位符的用途,java,database-migration,flyway,property-placeholder,Java,Database Migration,Flyway,Property Placeholder,数据库迁移工具包括一个用于的功能 占位符的用途是什么?在什么样的实际场景中占位符可能有用?你能描述一些简单的例子来证明它的有用性吗 的底部示例显示了在SQL中使用占位符。我们将如何设置要插入到该占位符位置的值?占位符值的源是否定义为环境变量、Java变量、a或其他 占位符是否只包含纯文本,而不包含其他数据类型 占位符只能在SQL文件中使用吗?可以在Java代码中的SQL字符串中使用占位符吗 还有其他地方可以使用占位符吗 我发现了这个问题,但它没有给我一个清晰的图像。占位符替换由处理 占位符的用途

数据库迁移工具包括一个用于的功能

占位符的用途是什么?在什么样的实际场景中占位符可能有用?你能描述一些简单的例子来证明它的有用性吗

的底部示例显示了在SQL中使用占位符。我们将如何设置要插入到该占位符位置的值?占位符值的源是否定义为环境变量、Java变量、a或其他

占位符是否只包含纯文本,而不包含其他数据类型

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

还有其他地方可以使用占位符吗


我发现了这个问题,但它没有给我一个清晰的图像。

占位符替换由处理

占位符的用途是什么?在什么样的实际场景中占位符可能有用?你能描述一些简单的例子来证明它的有用性吗

假设我的启动很差,只有一个数据库,并且使用表前缀来分隔名为
dev
test
prod
的每个环境。在我的Flyway迁移中,我可以为这个变量选择一个占位符
${env}
。因此,现在我可以在所有环境中使用相同的迁移,使用占位符并在运行时提供值

假设我有一个迁移,在数据库中创建一个只读用户和密码。在脚本中包含密码是不好的做法,因此使用占位符可以在运行时传递密码

我们将如何设置要插入到该占位符位置的值

在类的实例上调用
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);
Map placeholdersFromProps=新的HashMap(占位符);
迭代器迭代器=props.entrySet().Iterator();
while(iterator.hasNext()){
Map.Entry=iterator.next();
String propertyName=entry.getKey();
if(propertyName.startsWith(占位符\属性\前缀)
&&propertyName.length()>占位符\属性\前缀.length()){
字符串占位符名称=propertyName.substring(占位符\属性\前缀.length());
字符串占位符值=entry.getValue();
placeholdersFromProps.put(占位符名称、占位符值);
iterator.remove();
}
}
设置占位符(占位符fromprops);
如果您正在使用CLI,请查看配置Flyway指南

占位符是否只包含纯文本,而不包含其他数据类型

只有字符串<代码>字符串占位符值=entry.getValue()

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

是的,只有一个普通的SQL文件。我通过检查对
Placeholder Replacer
的引用了解到这一点,但这也是有意义的,因为Java迁移可能不包含SQL,并且需要某种编译器插件才能工作。此外,Java迁移可以做任何事情,因此如果它想使用与SQL脚本相同的占位符,它可以。只需编写Java来加载属性并进行字符串替换。如果你愿意,你甚至可以使用占位符替换器

还有其他地方可以使用占位符吗


我在检查时没有发现任何问题。

占位符替换由处理

占位符的用途是什么?在什么样的实际场景中占位符可能有用?你能描述一些简单的例子来证明它的有用性吗

假设我的启动很差,只有一个数据库,并且使用表前缀来分隔名为
dev
test
prod
的每个环境。在我的Flyway迁移中,我可以为这个变量选择一个占位符
${env}
。因此,现在我可以在所有环境中使用相同的迁移,使用占位符并在运行时提供值

假设我有一个迁移,在数据库中创建一个只读用户和密码。在脚本中包含密码是不好的做法,因此使用占位符可以在运行时传递密码

我们将如何设置要插入到该占位符位置的值

在类的实例上调用
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);
Map placeholdersFromProps=新的HashMap(占位符);
迭代器迭代器=props.entrySet().Iterator();
while(iterator.hasNext()){
Map.Entry=iterator.next();
String propertyName=entry.getKey();
if(propertyName.startsWith(占位符\属性\前缀)
&&propertyName.length()>占位符\属性\前缀.length()){
字符串占位符名称=propertyName.substring(占位符\属性\前缀.length());
字符串占位符值=entry.getValue();
placeholdersFromProps.put(占位符名称、占位符值);
iterator.remove();
}
}
设置占位符(占位符fromprops);
如果您正在使用CLI,请查看配置Flyway指南

占位符是否只包含纯文本,而不包含其他数据类型

只有字符串<代码>字符串占位符值=entry.getValue()

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

是的,只有一个普通的SQL文件。我通过查看
占位符的引用了解这一点