完全自动数据库可升级的Spring启动应用程序

时间:2016-04-25 05:05:05

标签: spring-boot flyway

我正在尝试使用flyway进行数据库迁移,并在应用程序启动时使用Spring boot的flyway支持自动升级数据库,随后我的JPA层将使用此数据库

但是,这要求在数据库中存在架构,以便主数据源初始化成功。有哪些选项可用于运行将在飞路迁移发生之前创建所需模式的SQL脚本。

请注意,如果我使用flyway gradle插件(并将URL设为jdbc:mysql://localhost/mysql。它确实为我创建了架构。我想知道是否可以在应用程序启动时从Java代码中实现这一点。

4 个答案:

答案 0 :(得分:0)

当架构为空时,Flyway不支持完全安装,只是迁移迁移执行。 您可以在第一次迁移中添加模式/用户创建脚本,但是您需要使用sysdba / root / admin用户执行迁移脚本,并且需要在每次迁移开始时设置当前模式。

如果使用Flyway,最不成问题的方法是首次手动安装架构并执行基线Flyway任务(也是手动)。然后,您就可以自动完成下一次迁移了。

尽管Flyway是一个很好的数据库迁移工具,但它并没有很好地涵盖这个特定的用例(第一次安装模式)。

答案 1 :(得分:0)

“我想知道我是否可以在应用程序启动时从Java代码中实现这一点。”

简单的答案是肯定的,因为Flyway支持使用java应用程序进行编程配置。 flyway文档的起点可以在这里找到

 https://flywaydb.org/documentation/api/

flyway使用标准JDBC DataSource,因此您可以使用Java编写数据库创建过程,然后让flyway处理模式管理。在许多环境中,您可能需要两个步骤,因为数据库/模式创建将需要数据库的管理员权限,而正在进行的模式管理将需要具有降低的访问权限的帐户。

答案 2 :(得分:0)

  • 您需要的是实现界面FlywayCallback

  • 为了从您的代码手动启动迁移,您可以使用flyway class

  • 上的migrate()方法
  • 跟踪迁移过程可以通过flyway类的MigrationInfoService()方法完成

答案 3 :(得分:0)

不幸的是,如果您的应用程序有一个期望架构存在的数据源,那么Flyway将无法使用该数据源来创建该方案。您必须创建另一个未绑定到模式的数据源,并通过FlywayMigrationStrategy使用无界数据源。

在您的属性文件中:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/myschema
  bootstrapDatasource:
    url: jdbc:mysql://localhost:3306

在您的配置文件中:

@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSourceProperties primaryDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSource primaryDataSource() {
    return primaryDataSourceProperties().initializeDataSourceBuilder().build();
}

@Bean
@ConfigurationProperties("spring.bootstrapDatasource")
public DataSource bootstrapDataSource() {
    return DataSourceBuilder.create().build();
}

在你的FlywayMigrationStrategy文件中:

@Inject
@Qualifier("bootstrapDataSource")
public void setBootstrapDataSource(DataSource bootstrapDataSource) {
    this.bootstrapDataSource = bootstrapDataSource;
}

@Override
public void migrate(Flyway flyway) {
    flyway.setDataSource(bootstrapDataSource);
    ...
    flyway.migrate()
}