Spring Boot 3.0.2中Flyway数据库迁移文件未被识别求助
1. 先盯紧迁移文件命名
Flyway对文件名规则卡得很严,必须严格遵循V<版本号>__<描述>.sql格式,比如V1__Create_test_table.sql:
- 版本号得是数字,带小数点也可以(比如V1.2)
- 版本号和描述之间必须是两个下划线,少一个都会被直接忽略
- 别加空格或特殊字符,不然Flyway连警告都不会给,直接跳过文件
2. 确认脚本放对路径
默认情况下,Flyway只会扫描src/main/resources/db/migration目录下的脚本。如果你的脚本放在其他路径,得在application.properties里手动配置:
spring.flyway.locations=classpath:你的自定义路径
同时在IntelliJ里右键该目录,选择Mark Directory as → Resources Root,否则IDE可能不会把它当作资源文件打包。
3. 强制Gradle复制脚本到Build目录
如果IDE没自动把SQL脚本复制到build目录,直接在build.gradle里加这段配置,强制资源文件打包:
sourceSets { main { resources { srcDirs = ["src/main/resources"] include "**/*.sql" } } } // 给bootJar任务加个兜底配置 bootJar { from sourceSets.main.resources }
执行./gradlew clean build后,去build/resources/main/db/migration目录确认脚本是否存在,没有的话就是配置还没生效。
4. 开Debug日志看真相
控制台没报错?大概率是日志级别太低,Flyway的执行细节被隐藏了。在application.properties里加一行:
logging.level.org.flywaydb=DEBUG
再启动应用或者执行./gradlew flywayMigrate,查看日志里有没有Found pending migration或Applying migration相关记录,就能明确Flyway是否识别到了你的脚本。
5. 绕开IDE直接用Gradle命令
别跟IDE较劲,直接在终端执行迁移命令,排除IDE构建问题:
./gradlew flywayMigrate -i
-i参数会输出详细执行日志,能看到Flyway是否加载到脚本、数据库连接是否正常、甚至是SQL脚本的隐性语法问题(比如SQL Server的语法兼容问题,没抛异常但执行失败)。
6. 查flyway_schema_history表实锤
直接去数据库里看flyway_schema_history表:
- 如果有对应版本的记录但
success字段为false,说明脚本执行失败,得检查SQL语法(比如SQL Server用[]包裹标识符,别用反引号) - 如果连对应版本的记录都没有,那就是Flyway根本没识别到脚本,回去重新检查命名和路径。
内容的提问来源于stack exchange,提问作者M Nouman

