Flyway 条件数据库迁移

Posted

技术标签:

【中文标题】Flyway 条件数据库迁移【英文标题】:Flyway conditional db migration 【发布时间】:2017-07-10 23:33:25 【问题描述】:

我正在尝试使用flyway,但我有一个不知道如何解决的场景:

当我应用 STANDARD 脚本时,我必须运行 V1.0__create_table_TAB1.sql 当我将脚本应用到 customer1 时,TAB1 表是一个视图,因此我必须运行 V1.0__create_view_TAB1_to_schema1.sql。

实际上:

└── sql
     ├── sql_common
     │   ├── V0.0 __.... sql
     │   └── V1.0__create_table_TAB1.sql
     ├── sql_customer1
     │   └── V1.0__create_view_TAB1_to_schema1.sql
     └── sql_customer2
         └── V1.0__create_view_TAB1_to_schema2.sql

应该总是应用sql_common 文件夹的脚本,但是V1.0(创建表TAB1),如果我应用到customer1 脚本不应该应用。 取而代之的是应用V1.0__create_view_TAB1_to_schema1.sql

我怎样才能防止这种情况发生?

【问题讨论】:

【参考方案1】:

使用以下结构:

└── sql
     ├── sql_common
     │   └── V0.0 __.... sql
     ├── sql_regular
     │   └── V1.0__create_table_TAB1.sql
     ├── sql_customer1
     │   └── V1.0__create_view_TAB1_to_schema1.sql
     └── sql_customer2
         └── V1.0__create_view_TAB1_to_schema2.sql

结合 Flyway.setLocations()。

常规:flyway.setLocations("filesystem:sql/sql_common", "filesystem:sql/sql_regular"); 客户1: flyway.setLocations("filesystem:sql/sql_common", "filesystem:sql/sql_customer1"); 客户2: flyway.setLocations("filesystem:sql/sql_common", "filesystem:sql/sql_customer2");

这样,每个案例将恰好有 1 个 v1.0 迁移。

【讨论】:

以上是关于Flyway 条件数据库迁移的主要内容,如果未能解决你的问题,请参考以下文章

使用 Flyway 迁移创建用户

使用 Flyway 迁移存储过程

使用 Flyway 更改文件名迁移

从特定版本开始 Flyway 迁移

flyway mysqldump迁移

Flyway 可重复迁移 - 在版本化迁移之前执行?