如何为MySQL与H2数据库维护共用的Flyway迁移文件?
共用Flyway迁移文件适配MySQL与H2的方案
完全可以维护一套共用的Flyway迁移文件,但需要处理两种数据库的语法差异——你遇到的错误就是典型的语法不兼容问题。
先解决当前的MySQL语法错误
错误提示里的DATA TYPE TEXT是H2特有的写法,MySQL不支持该语法。只需将迁移文件中类似column_name DATA TYPE TEXT的语句,改为MySQL兼容的column_name TEXT即可解决这个问题。
共用迁移文件的通用方案
1. 优先使用MySQL兼容语法
你的H2配置已经添加了MODE=MYSQL,这会让H2模拟MySQL的语法行为,绝大多数MySQL的语法在H2中都能正常运行。编写迁移文件时直接采用MySQL的语法规范:
- 自增主键用
AUTO_INCREMENT(H2在MySQL模式下支持),不用H2的IDENTITY - 字符串类型用
VARCHAR(n)或TEXT,避免H2独有的VARCHAR_IGNORECASE - 日期类型用
DATETIME或TIMESTAMP,保持与MySQL一致
2. 用Flyway的数据库条件注释处理差异
如果遇到少数无法兼容的语法,可以用Flyway的数据库特定注释区分:
CREATE TABLE shipment ( id INT AUTO_INCREMENT PRIMARY KEY, /*mysql*/ created_at DATETIME DEFAULT CURRENT_TIMESTAMP, /*h2*/ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Flyway会根据当前连接的数据库,自动识别并执行对应注释块内的SQL。
3. 优化配置路径
你当前的Flyway配置spring.flyway.locations = h2/db/migration带有H2标识,建议改为通用路径,比如:
spring.flyway.locations = classpath:db/migration
这样无论使用MySQL还是H2,都能读取同一套迁移文件。
内容的提问来源于stack exchange,提问作者Bala Velan
相关产品推荐
相关产品推荐

