新手求教:如何在FlywayDB中为PROD/TEST/DEMO多环境组织迁移文件?
嘿,刚接触Flyway的话,这种多环境的迁移文件组织其实Flyway本身就有很贴合的方案,我给你一步步拆解怎么弄:
核心思路:拆分通用迁移与环境特定迁移
首先把你的SQL文件分成两类:
- 通用迁移文件:所有环境(PROD/TEST/DEMO)都需要执行的,比如你提到的
dbUpdateSchema2.0.sql和dbUserSchemaUpdate.sql - 环境特定迁移文件:只针对单个环境执行的,比如
dbDataUpdatePROD.sql、dbDataUpdateTEST.sql这类
具体文件结构组织
按照Flyway的命名规范(V<版本号>__<描述>.sql,版本号用来控制执行顺序)来整理文件,最终的目录结构大概是这样:
your-project/ └── sql/ ├── V2.0__update_core_schema.sql # 对应原来的dbUpdateSchema2.0.sql ├── V2.1__update_user_schema.sql # 对应原来的dbUserSchemaUpdate.sql ├── prod/ │ └── V2.0__prod_specific_data_update.sql # 对应原来的dbDataUpdatePROD.sql ├── test/ │ └── V2.0__test_specific_data_update.sql # 对应原来的dbDataUpdateTEST.sql └── demo/ └── V2.0__demo_specific_data_update.sql # 对应原来的dbDataUpdateDEMO.sql
这里要注意:环境特定迁移的版本号最好和对应的通用迁移版本保持一致,比如通用的核心 schema 更新是V2.0,那同批次的环境数据更新也用V2.0,这样逻辑上是同一阶段的升级,后续维护起来更清晰。
配置Flyway加载对应环境的迁移
接下来需要给每个环境配置Flyway的locations参数,让它知道要加载通用目录+对应环境的目录:
- 针对PROD环境,配置项可以是:
flyway.locations=filesystem:sql,filesystem:sql/prod - 针对TEST环境:
flyway.locations=filesystem:sql,filesystem:sql/test - 针对DEMO环境:
flyway.locations=filesystem:sql,filesystem:sql/demo
这样Flyway执行的时候,会先按版本顺序跑完sql目录下的通用迁移,再执行对应环境子目录里的特定迁移,完美匹配你之前的升级逻辑。
额外小提示
如果你不想单独建子目录,也可以在通用脚本里用SQL的条件判断来区分环境(比如判断当前数据库的环境变量),但这种方式容易让脚本变得臃肿,不如目录分离直观,所以更推荐前面的目录方案。
内容的提问来源于stack exchange,提问作者mmalmeida
相关产品推荐
相关产品推荐

