当前位置: 首页 > 知识库问答 >
问题:

如何创建在应用程序启动并使用其他服务后运行的Flyway迁移?

匡祖鹤
2023-03-14

我刚刚在用户表中添加了一个新的时区列,现在我需要为所有现有记录填充它。

这些值应该根据同一表格中的另一列计算出来。

转换由名为OpenCage的地理服务完成。

所以我想创建一个新的Flyway迁移

  1. 读取表的每一行,获取其邮政编码值
  2. 调用地理服务的API并将邮政编码值传递给它
  3. 接收返回的时区,
  4. 并将其存储在时区列中

地理服务是我的应用程序中的SpringBoot@Service,所以在迁移类中,我需要@Autow的它。

而且我认为这种迁移需要在应用程序启动后立即自动运行,而不是使用Commmandflyway:迁移

我当前的实现如下所示,问题是它不会在应用程序启动后运行。

public class V151__CalculateTimeZoneForExistingUsers extends BaseJavaMigration {
    @Autowired
    private GeocodingService geocodingService;

    public void migrate(Context context) throws Exception {
        try (Statement select = context.getConnection().createStatement()) {
            try (ResultSet rows = select.executeQuery("SELECT id, postal_code FROM user")) {
                while (rows.next()) {
                    long id = rows.getLong(1);
                    String postalCode = rows.getString(2);

                    JOpenCageResult jOpenCageResult = geocodingService.geocode(postalCode);
                    if (jOpenCageResult != null && jOpenCageResult.getAnnotations() != null && jOpenCageResult.getAnnotations().getTimeZone() != null) {
                        String timeZone = jOpenCageResult.getAnnotations().getTimeZone().getName();
                        try (Statement update = context.getConnection().createStatement()) {
                            update.execute("UPDATE user SET time_zone = '" + timeZone + "' WHERE id=" + id);
                        }
                    }
                }
            }
        }
    }
}

它位于src\main\java\org\LayerOne\LayerTwo\db\migration\V151\uu CalculateTimeZoneForExistingUsers包中。java

pom.xml中,flyway的配置是

                <configuration>
                    <user>username</user>
                    <password>password</password>
                    <url>jdbc:mysql://localhost:3306/myDB</url>
                    <baselineOnMigrate>true</baselineOnMigrate>
                    <baselineVersion>0.0</baselineVersion>
                    <locations>
                        <location>classpath:db/migration, classpath:org/LayerOne/LayerTwo/db/migration</location>
                    </locations>
                </configuration>

使用flyway:info,我可以看到迁移列表。但它不会在应用程序启动后运行。

谁能教我怎么让它运转?

谢啦!

共有1个答案

巴星华
2023-03-14

原来我只需要在类中添加Springboot注释@Component就像

@Component
public class V151__CalculateTimeZoneForExistingUsers extends BaseJavaMigration {
...
}

然后它将在应用程序启动后运行

 类似资料:
  • 我有一个带有几个实体类的Spring Boot应用程序,我正在尝试用Flyway实现数据库迁移。在启动时,似乎Spring Boot根本没有运行flyway。 这是我的应用程序.属性 这是我的建筑里的线.Gradle和flyway有关

  • 我想直接从我的应用程序运行另一个应用程序(Polaris Office)。但它也应该直接打开PDF文件。 我尝试了以下代码: 知道我该怎么做吗?我当前的代码给出了错误消息: 原因:java。lang.SecurityException:权限拒绝:启动Intent{act=android.Intent.action.MAIN dat=file:///mnt/sdcard/pdf.pdftyp=app

  • 主要问题--这看起来像是一个基本的flyway问题,我可能(不知为什么)在我的研究中错过了这个问题,但是--当尝试使用flyway迁移数据时,是否可以访问applications services(spring配置的)?下面的一些细节- 其他详细信息- 我知道我们不能注入spring数据服务等(从这个SO问题中了解到)。我从数据访问的角度理解了这一点。 但是在使用flyway时,我们是否可以不使用

  • 我想让我的Flutter应用程序总是在后台运行。在android中,我们必须创建一个始终在后台运行的服务。我在Flutter文档中找不到关于服务的东西。 有可能用Flutter做这种事情吗?

  • 正如标题所示,我正在寻找任何可以帮助我在Springs应用程序上下文(准确地说是持久性上下文)加载之前运行Flyway迁移的方法。原因是我在应用程序启动时运行的查询很少。这导致我的测试失败,因为正在对尚不存在的数据库表执行查询。我使用H2作为我的测试数据库。现在我只使用flyway核心依赖: 我有一个单一的Flyway配置类,如下所示: 并且属性在 我想实现的是:1.飞行路线做迁移2。Spring