【问题标题】:What maven phase should I bind the flyway:migrate goal to?我应该将 flyway:migrate 目标绑定到哪个 Maven 阶段?
【发布时间】:2019-01-25 15:19:47
【问题描述】:

我正在使用 Flyway 使我的数据库架构保持最新。我希望使用 flyway 的 maven 插件将其作为构建生命周期中的一个步骤自动化,该插件将执行 flyway:migrate 目标。

我应该将此目标绑定到哪个 Maven 阶段?我很困惑,因为有几个不同的用例。

  1. 我希望我的 test db 在每次运行测试时完全销毁并重建,因此在 test 阶段执行一次插件是有意义的

  2. 在我的 开发 环境中,我希望每次构建项目时都迁移我的数据库(而不是重建!),以使架构保持最新。我会把它绑定到...package吗?还是compile?

  3. 在我的 生产 环境中,我同样想再次运行 migrate,但在我的生产数据库上。这甚至应该是自动化的,还是应该手动运行?如果它应该是自动化的,它会成为deploy 阶段的一部分吗?

谢谢!

【问题讨论】:

  • 关于您的第 1 部分。我建议使用像 pre-integration-test、integration-test 和 post-integration 这样的集成测试阶段,因为这些是集成测试而不是单元测试......而且它确实更适合集成测试部分...除此之外,您似乎弄错了构建时间和运行时间....
  • 谢谢,我意识到我在发布问题后将构建和运行时间混为一谈。感谢您的意见。

标签: maven flyway


【解决方案1】:

通常,您希望在运行时运行数据库迁移,而不是在使用 Maven 构建项目期间。

要在运行时运行迁移,请参考官方文档:https://flywaydb.org/documentation/usage/api/。它提供了几种配置方式:

程序化配置

import org.flywaydb.core.Flyway;

...
Flyway flyway = Flyway.configure().dataSource(url, user, password).load();
flyway.migrate();

// Start the rest of the application (incl. Hibernate)
...

弹簧配置

<bean id="flywayConfig" class="org.flywaydb.core.api.configuration.ClassicConfiguration">
    <property name="dataSource" ref="..."/>
    ...
</bean>

<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
    <constructor-arg ref="flywayConfig"/>
</bean>

<!-- The rest of the application (incl. Hibernate) -->
<!-- Must be run after Flyway to ensure the database is compatible with the code -->
<bean id="sessionFactory" class="..." depends-on="flyway">
    ...
</bean>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2015-11-05
    • 2011-04-28
    相关资源
    最近更新 更多