Flyway DB迁移——如何访问应用服务(Spring已配置)
Flyway DB migration - how to access application services (Spring configured)
主要问题 - 这似乎是一个基本的飞路问题,我在研究过程中可能(不知何故)错过了这个问题但是 - 是否可以访问应用程序服务(spring 已配置)尝试使用 flyway 迁移数据时?下面是一些细节 -
其他详细信息 -
- 我知道我们不能注入 spring 数据服务等(从中学习
所以问题)。我从数据访问点了解这一点
查看。
- 但是我们可以不使用(通过注入)任何其他应用程序服务吗?
在使用 flyway 时(我搜索了示例 - 但没有
运气好,飞路文档也没有给出详细信息)
- 假设我们不能使用任何 Spring 服务(我找到了一些方法来
解决这个问题),我们可以访问在中声明的属性吗
application.properties / .yml(这似乎也不可能)。
根据我们的要求 - 我们已经向几个 table 添加了几个新字段,作为发布的一部分,我们希望填充那些有数据的列。这需要我们(或飞路)执行以下算法 -
- 从第一个table获取数据。
- 使用每行中的一些数据,使用 API 查找更多数据
打电话。
- API 的 URL 是特定于环境的(因此第三点
以上)。
- 将从 API 返回的数据更新到新添加的列中。
- 对下一个 table 重复上述步骤。
P.S。 - 我知道,在同一 table 中添加依赖于其他列的列不符合 3rd normal 等。但出于此 post 之外的原因,这是必需的。
技术堆栈 -
- Spring 引导 1.3.x
- 飞路 4.0.3
- 使用 Java 迁移
我试过的几个例子如下 -
我的飞行路线迁移class如下。
public class R__MigrationYeah implements SpringJdbcMigration {
@Value("${mypath.subpath}") // this does not work !
private String someStringIwannaUse;
@Inject // this does not work either (even with Autowired or Const. injection)!
private MyService myService;
}
我看到一些 posts / 博客有关于如何配置 flyways MigrationResolver 或 ConfigurationAware 等的复杂细节 - 不确定他们是否解决了这个问题(即使他们解决了 - 这是很多只是编写一个快速迁移脚本的工作 - 这是唯一的方法吗?)。
最后 - 我知道我遗漏了一些东西,因为如果我们必须编写 flyway Java 代码而不能使用任何现有应用程序 class es 通过 Spring,那么它与编写一个独立的迁移项目没有什么不同(因此除了使数据库连接可用之外,flyway 没有增加任何价值)——我确信这不可能。
任何帮助都会很好!
我认为您想比设计时更动态地使用 flyway。
基本上它只是针对 DB-Schema,你可以做任何 sql 可以做的事情,但是因为
它以一种您不希望的可重复、可靠、循序渐进的方式完成工作
其中的任何真实业务数据。 Flyway 使用你提供的静态脚本,你
不能让它们随时间动态变化(它会通过校验和不匹配来抗议)或 "API-Calls".
对于此类内容,您可以创建自己的 Spring 引导应用程序并通过它的 Java API 使用 Flyway。沿着这条线。
@SpringBootApplication
@Import(ServiceConfig.class)
public class FlyWayApp implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(FlyWayApp.class, args);
}
@Value("${mypath.subpath}")
private String someStringIwannaUse;
@Autowired
private MyService myService;
@Override
public void run(String... args) throws Exception {
// Create the Flyway instance
Flyway flyway = new Flyway();
// Point it to the database
flyway.setDataSource("jdbc:h2:file:./target/foobar", "sa", null);
//Fetch data and create migration scripts needed by Flyway
myService.createMigrationScripts();
// Start the migration
flyway.migrate();
}
}
无法在 flyway 迁移中使用依赖注入。
flyway 的下一个版本将支持从 spring bean 进行依赖注入。请参阅 Github issue for more details. On 是当前可用版本的解决方法。
主要问题 - 这似乎是一个基本的飞路问题,我在研究过程中可能(不知何故)错过了这个问题但是 - 是否可以访问应用程序服务(spring 已配置)尝试使用 flyway 迁移数据时?下面是一些细节 -
其他详细信息 -
- 我知道我们不能注入 spring 数据服务等(从中学习 所以问题)。我从数据访问点了解这一点 查看。
- 但是我们可以不使用(通过注入)任何其他应用程序服务吗? 在使用 flyway 时(我搜索了示例 - 但没有 运气好,飞路文档也没有给出详细信息)
- 假设我们不能使用任何 Spring 服务(我找到了一些方法来 解决这个问题),我们可以访问在中声明的属性吗 application.properties / .yml(这似乎也不可能)。
根据我们的要求 - 我们已经向几个 table 添加了几个新字段,作为发布的一部分,我们希望填充那些有数据的列。这需要我们(或飞路)执行以下算法 -
- 从第一个table获取数据。
- 使用每行中的一些数据,使用 API 查找更多数据 打电话。
- API 的 URL 是特定于环境的(因此第三点 以上)。
- 将从 API 返回的数据更新到新添加的列中。
- 对下一个 table 重复上述步骤。
P.S。 - 我知道,在同一 table 中添加依赖于其他列的列不符合 3rd normal 等。但出于此 post 之外的原因,这是必需的。
技术堆栈 -
- Spring 引导 1.3.x
- 飞路 4.0.3
- 使用 Java 迁移
我试过的几个例子如下 -
我的飞行路线迁移class如下。
public class R__MigrationYeah implements SpringJdbcMigration {
@Value("${mypath.subpath}") // this does not work !
private String someStringIwannaUse;
@Inject // this does not work either (even with Autowired or Const. injection)!
private MyService myService;
}
我看到一些 posts / 博客有关于如何配置 flyways MigrationResolver 或 ConfigurationAware 等的复杂细节 - 不确定他们是否解决了这个问题(即使他们解决了 - 这是很多只是编写一个快速迁移脚本的工作 - 这是唯一的方法吗?)。
最后 - 我知道我遗漏了一些东西,因为如果我们必须编写 flyway Java 代码而不能使用任何现有应用程序 class es 通过 Spring,那么它与编写一个独立的迁移项目没有什么不同(因此除了使数据库连接可用之外,flyway 没有增加任何价值)——我确信这不可能。
任何帮助都会很好!
我认为您想比设计时更动态地使用 flyway。 基本上它只是针对 DB-Schema,你可以做任何 sql 可以做的事情,但是因为 它以一种您不希望的可重复、可靠、循序渐进的方式完成工作 其中的任何真实业务数据。 Flyway 使用你提供的静态脚本,你 不能让它们随时间动态变化(它会通过校验和不匹配来抗议)或 "API-Calls".
对于此类内容,您可以创建自己的 Spring 引导应用程序并通过它的 Java API 使用 Flyway。沿着这条线。
@SpringBootApplication
@Import(ServiceConfig.class)
public class FlyWayApp implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(FlyWayApp.class, args);
}
@Value("${mypath.subpath}")
private String someStringIwannaUse;
@Autowired
private MyService myService;
@Override
public void run(String... args) throws Exception {
// Create the Flyway instance
Flyway flyway = new Flyway();
// Point it to the database
flyway.setDataSource("jdbc:h2:file:./target/foobar", "sa", null);
//Fetch data and create migration scripts needed by Flyway
myService.createMigrationScripts();
// Start the migration
flyway.migrate();
}
}
无法在 flyway 迁移中使用依赖注入。
flyway 的下一个版本将支持从 spring bean 进行依赖注入。请参阅 Github issue for more details. On