Flyway 7.15.0解析SQL不完整致迁移失败,应切换至哪个版本?
问题解决建议
核心原因
Flyway 7.15.0在解析包含嵌套WHILE块的MySQL存储过程时,会错误地将第一个END WHILE识别为整个SQL脚本的结束符,导致后续代码无法被正确解析,进而抛出语法错误。
两种解决方案
方案1:使用自定义语句分隔符(无需切换版本)
在迁移SQL文件开头添加自定义分隔符声明,让Flyway正确识别存储过程的边界:
DELIMITER // DROP PROCEDURE IF EXISTS updateIndex; CREATE PROCEDURE updateIndex() BEGIN DECLARE key1_value INT DEFAULT 0; DECLARE tname varchar(30); DECLARE loopNum INT DEFAULT 1; DECLARE i INT DEFAULT 1; DECLARE flag INT DEFAULT 1; DECLARE tmp_result CURSOR FOR select key1, name,count(*) from test_flyway group by key1,name having count(*) > 1; DECLARE EXIT HANDLER FOR NOT FOUND SET flag = 0; OPEN tmp_result; WHILE flag = 1 DO FETCH tmp_result INTO key1_value, tname, loopNum; WHILE i < loopNum DO UPDATE test_flyway set name = CONCAT(name,'(', i,')') WHERE id = ( SELECT tmp.id FROM ( SELECT id from test_flyway WHERE key1 = key1_value and name = tname LIMIT 1 ) tmp ); SET i = i + 1; END while; SET i = 1; END while; END // DELIMITER ;
通过DELIMITER //将语句分隔符临时改为//,存储过程定义结束后再改回默认的;,就能避免Flyway误解析嵌套的END WHILE。
方案2:切换Flyway版本
如果必须通过版本升级解决,推荐升级到Flyway 8.0.0及以上版本。Flyway 8.x系列对MySQL存储过程的语法解析逻辑进行了优化,修复了嵌套块的边界识别问题,能正确处理这类包含多层WHILE的存储过程脚本。
内容的提问来源于stack exchange,提问作者Colin
相关产品推荐
相关产品推荐

