Flyway数据库迁移 - 如何访问应用程序服务(Spring配置)

时间:2016-08-04 16:43:21

标签: java spring database-migration flyway

主要问题 - 这可能看起来像一个基本的飞路问题,我可能(不知何故)在我的研究中错过了这个但是 - 是否有可能在尝试时访问应用程序服务(弹簧配置)使用flyway迁移数据?下面几个细节 -

其他详情 -

  • 我知道我们无法注入Spring数据服务等(learnt from this SO question)。我从数据访问点了解到这一点 图。
  • 但是我们不能使用(通过注入)任何其他应用程序服务 或者在使用flyway时(我搜索了一些例子 - 但没有 好运,也没有关于飞路文件的详细信息。)
  • 让我们说我们不能使用任何Spring服务(我找到了一些方法) 解决这个问题),我们可以访问声明的属性吗? application.properties / .yml(这似乎也不可能)。

将上述内容纳入我们的要求 - 我们在几个表中添加了几个新字段,作为发布的一部分,我们希望用数据填充这些列。这要求我们(或飞路)执行以下算法 -

  • 从第一张表中获取数据。
  • 使用每行中的一些数据,使用API​​查找更多数据 调用
  • API的URL是特定于环境的(因此第三点 上文)。
  • 将从API返回的数据更新为新添加的列。
  • 对下一个表重复上述步骤。

P.S。 - 我知道,添加依赖于同一个表中其他列的列不符合第3个法线等。但是由于这篇文章之外的原因,它是必需的。

技术堆栈 -

  1. Spring boot 1.3.x
  2. Flyway 4.0.3
  3. 使用Java迁移
  4. 我尝试的几个例子如下 -

    我的飞路移民课程如下。

    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;
    
    }
    

    我看过一些帖子/博客有关于如何配置flyways MigrationResolver或ConfigurationAware等的复杂细节 - 并且不确定他们是否解决了这个问题(即使他们这样做了 - 只是为了快速编写这些工作很多迁移脚本 - 这是唯一的方法吗?)。

    最后 - 我知道我遗漏了一些东西,因为如果我们必须编写flyway Java代码而不能通过Spring使用任何现有的应用程序类,那么它与编写独立的迁移没有什么不同项目(因此除了提供数据库连接之外,没有飞路增值) - 我确信情况并非如此。

    任何帮助都会很棒!

3 个答案:

答案 0 :(得分:0)

在飞路迁移中无法使用依赖注入。

flyway的下一个版本将支持spring bean的依赖注入。有关详细信息,请参阅Github issue。在Stack Overflow上是当前版本的解决方法。

答案 1 :(得分:-2)

我认为你想要比我们设计的更动态地使用flyway。 基本上它只适用于DB-Schema,你可以做任何sql可以做的事情,但从那以后 它以一种你不想要的可重复,可靠,循序渐进的方式工作 其中的任何真实商业数据。 Flyway使用您提供的静态脚本 不能让它们随时间动态变化(它会通过校验和不匹配来抗议)或“API-Calls”。

答案 2 :(得分:-2)

对于那种东西,你可以创建自己的Spring Boot应用程序,并通过它的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();
    }
}