2016-08-04 40 views
0

主要问题 - 这似乎是一个基本的飞行路线的问题,我可能会(在某种程度上)我的研究过程中错过了这一点,但 - 这可能访问的应用程序尝试使用flyway迁移数据时使用的服务(配置了spring)?迁飞DB迁移 - 如何访问应用服务(配置春季)

其他细节 - - 下面的几个细节

  • 我知道我们不能注入春天的数据服务等。(learnt from this SO question)。我从数据访问点 的角度了解这一点。
  • 但是我们不能使用(注射)​​任何其他应用服务 要么同时使用飞路(我搜索的例子 - 但没有 运气,并没有对飞行用文件给出任何细节)
  • 让我们说我们不能用任何Spring服务(我找到一些方法来解决这个问题),我们可以访问在 application.properties/.yml中声明的属性(这也不可能)。

把上面的我们的要求方面 - 我们已经增加了几个新领域的几桌,当我们要填充这些列与数据发布的一部分。这要求我们(或飞路)执行以下算法 -

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

P.S. - 我知道,添加依赖于同一个表中的其他列的列不符合第三常规等,但由于本文之外的原因,它是必需的。

技术堆栈 -

  1. 春天启动的1.3.x
  2. 迁飞4.0.3
  3. 使用Java迁移

几个例子,我试过如下 -

我的飞路m移民课程如下。

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; 

} 

我看到一些帖子/有关于如何配置飞行路线繁复的细节博客MigrationResolver或ConfigurationAware等等 - 不知道他们解决这个问题(即使他们这样做 - 这是工作很多刚编写一个快速迁移脚本 - 这是唯一的方法吗?)。

最后 - 我知道我失去了一些东西,因为如果我们要编写飞行用的Java代码,而不能使用任何现有应用程序类直通春天,那就不会有比写一个独立的迁移项目(因此没有不同除了使数据库连接可用外,通过flyway添加的值) - 我确信这不是这种情况。

任何帮助将是伟大的!

+0

**更新** - 我们终于结束了使用的解决方法解决方案(如在上述问题的最后一节,也从@DanielKafer下面的答案)。由于这种方式不适用于飞行路线。 _P.S。不清楚为什么下面的问题被低估?对于新手来说,我错过了什么吗? –

回答

0

在飞路迁移中不可能使用依赖注入。

从迁徙路线的下一版本将支持从春豆依赖注入。有关更多详细信息,请参阅Github issue。在Stack Overflow是可用的当前版本的解决方法。

-2

我想你想更动态使用的飞行路线,比它的设计。 基本上它只是为DB-模式,你可以做任何事情SQL可以做,但因为 它它工作在一个可重复的,可靠的,一步一步,你不希望它 任何实际业务数据的方式。 Flyway使用您提供的静态脚本,您不能让它们随着时间的推移而动态更改(它会通过校验和不匹配)或“API调用”。

-2

对于这样的东西,你可以创建自己的春天启动的应用程序,并通过它使用迁飞的Java API。沿着这条线的东西。

@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(); 
    } 
}