Flyway 以编程方式设置占位符

Posted

技术标签:

【中文标题】Flyway 以编程方式设置占位符【英文标题】:Flyway setting placeholders programmatically 【发布时间】:2019-02-15 17:33:26 【问题描述】:

我有一个非常简单的 Spring Boot 应用程序,它使用 Flyway 进行数据库迁移。我想在迁移开始之前使用 Spring 配置类以编程方式设置 Flyway 占位符。

我做的是:

@Configuration
public class FlywayConfiguration 

  @Autowired
  private Flyway flyway;

  @Value("$threedsserver.db.tableSpaces.data:pg_default")
  private String tablespaceData;

  @Value("$threedsserver.db.tableSpaces.index:pg_default")
  private String tablespaceIndex;

  @Value("$threedsserver.db.tableSpaces.lob:pg_default")
  private String tablespaceLob;

  @PostConstruct
  void setFlywayPlaceholders() 
    Map<String, String> placeholders = flyway.getPlaceholders();
    placeholders.put("tablespace_data", tablespaceData);
    placeholders.put("tablespace_index", tablespaceIndex);
    placeholders.put("tablespace_lob", tablespaceLob);
    flyway.setPlaceholders(placeholders);
  

然后在我的迁移脚本中使用$tablespace_data 属性。迁移失败:

No value provided for placeholder expressions: $tablespace_data

我想迁移在配置文件被处理之前就开始了。 如何解决这个问题?我不想使用 application.properties 来设置 flyway 占位符,但所有其他属性(如 spring.flyway.userspring.flyway.password 等)都希望由 application.properties 设置。

【问题讨论】:

【参考方案1】:

您可以像这样使用FlywayConfigurationCustomizer

import org.flywaydb.core.api.configuration.FluentConfiguration
import org.springframework.boot.autoconfigure.flyway.FlywayConfigurationCustomizer
import org.springframework.context.annotation.Configuration

@Configuration
class CustomFlywayConfiguration : FlywayConfigurationCustomizer 
    override fun customize(configuration: FluentConfiguration?) 
        configuration?.placeholders?.put("tablespace_index", "some_value")
    

我有 Spring Boot Flyway 集成的示例here

【讨论】:

以上是关于Flyway 以编程方式设置占位符的主要内容,如果未能解决你的问题,请参考以下文章

Swift 以编程方式设置文本字段的占位符

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

使用 flyway 占位符生成 sql 语句

以编程方式访问由属性占位符创建的属性

flyway POM.XML 中的默认占位符

占位符如何在 Flyway 中工作?