Flyway中按顺序执行不同文件夹SQL脚本并保留历史记录的方法
解决Flyway同版本脚本执行顺序与历史保留问题
方案1:拆分版本号,区分DDL与DML
给DDL和DML脚本设置分层版本号,让Flyway按自然顺序执行:
- DDL脚本使用
V1__xxx.sql、V2__xxx.sql这类整数版本号 - 对应版本的DML脚本使用
V1.1__xxx.sql、V2.1__xxx.sql这类带小数的版本号
这种方式下,Flyway会先执行所有整数版本的DDL脚本,再执行对应小数版本的DML脚本,完整保留所有执行历史,同时避免校验和冲突。
方案2:分阶段指定脚本目录+开启乱序执行
利用Flyway的locations配置分阶段指定脚本目录,结合outOfOrder参数允许同版本脚本补充执行(适用于Flyway 5.0+):
- 先执行DDL脚本:
flyway -locations=filesystem:./DDL migrate - 再执行DML脚本:
flyway -locations=filesystem:./DML -outOfOrder=true migrate
该方法会将DDL和DML的执行记录全部保留在flyway_schema_history表中,无需清空历史。
方案3:合并同版本的DDL与DML脚本
将同版本号的DDL和DML内容合并到同一个脚本文件中,按先DDL后DML的顺序编写语句,一次性执行。这样既保证了执行顺序,又不会触发校验和不匹配的问题,执行历史也会完整记录。
错误原因说明:你遇到的校验和不匹配,是因为Flyway会根据脚本内容生成校验和并存储在
flyway_schema_history表中,同版本号但内容不同的DDL、DML脚本,会被Flyway判定为同一版本脚本被篡改,从而触发校验失败。
内容的提问来源于stack exchange,提问作者Alex Ed
相关产品推荐
相关产品推荐

