我正在尝试使用flyway进行数据库迁移,并在应用程序启动时使用Spring boot的flyway支持自动升级数据库,随后我的JPA层将使用此数据库
但是,这要求在数据库中存在架构,以便主数据源初始化成功。有哪些选项可用于运行将在飞路迁移发生之前创建所需模式的SQL脚本。
请注意,如果我使用flyway gradle插件(并将URL设为jdbc:mysql://localhost/mysql
。它确实为我创建了架构。我想知道是否可以在应用程序启动时从Java代码中实现这一点。
答案 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
跟踪迁移过程可以通过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()
}