VSCode中执行Flyway迁移需通过终端调用CLI而非插件,关键在于确保flyway命令可达、flyway.conf置于项目根目录、SQL脚本命名严格遵循Vx.y.z__desc.sql规范,并以工作区根目录为路径基准。

VSCode集成终端能直接执行数据库迁移命令,但必须绕开“插件幻想”——它不自动识别你项目里装了Flyway或Liquibase,也不会读application.yml里的配置。真正起作用的是你在终端里敲的那条命令,以及它背后依赖的环境是否就绪。
为什么flyway migrate在终端里报command not found
这不是VSCode的问题,而是你的shell没找到flyway可执行文件。
- 先在系统任意终端(非VSCode)运行
flyway -v,确认能输出版本号;如果不行,说明CLI没装或没加进PATH - VSCode集成终端默认继承系统
PATH,但某些Linux桌面环境或macOS的GUI启动方式会导致PATH不完整——此时需在settings.json里显式设置:"terminal.integrated.env.linux": { "PATH": "/usr/local/bin:/opt/homebrew/bin:${env:PATH}" } - 若用Maven wrapper,别写
flyway migrate,改用./mvnw flyway:migrate,并确保mvnw有执行权限(chmod +x ./mvnw)
连接失败:Unable to connect to database但URL和密码都对
常见原因是JDBC驱动不在classpath,或者flyway.conf没被正确加载。
-
flywayCLI默认只读项目根目录下的flyway.conf,不会扫描src/main/resources/;把配置文件放到项目顶层,或用-c参数显式指定路径:flyway -c=./config/flyway.conf migrate - PostgreSQL用户常漏掉
flyway.locations,导致SQL脚本根本没被扫描——检查flyway.conf里是否有flyway.locations=filesystem:src/main/resources/db/migration - MySQL连接URL要写全:
flyway.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC,注意&是XML/JSON转义,终端里实际要用&(单个符号),否则解析失败
SQL脚本执行顺序错乱或被跳过
Flyway靠文件名排序,不是按修改时间,也不是按字母顺序随便排。
- 命名必须严格匹配
V<major>.<minor>.<patch>__<description>.sql,例如V1.0.0__init.sql、V1.0.1__add_user_table.sql;中间两个下划线__不能少,也不能多 - 不要用
V1或V1.0这种简写——Flyway会把它当V1.0.0,但后续V1.0.1可能被忽略 - 如果脚本里含
DELIMITER(如MySQL存储过程),Flyway默认不支持;得在flyway.conf里加flyway.sqlMigrationSeparator=GO,再把分隔符改成GO
最易被忽略的一点:VSCode终端执行迁移时,当前工作目录决定flyway.conf和SQL脚本的相对路径起点。哪怕你在文件树里右键点击某个SQL文件,终端也永远以${workspaceFolder}为基准——别指望它自动切到src/main/resources再跑命令。


















