Flyway MySQL语法错误
我们从一个月开始使用Flyway,没有遇到任何问题 但是,今天我尝试添加一个新的迁移脚本,它非常长(超过1500行),并且遇到了一个奇怪的MySQL语法错误 我在MySQL Workbench中打开了这个脚本,没有报告语法错误,脚本执行时没有错误 此名为“V10012_uuinsert-acceptance-testing-event-moment-passed.sql”的脚本包含以下说明Flyway MySQL语法错误,mysql,jdbc,flyway,Mysql,Jdbc,Flyway,我们从一个月开始使用Flyway,没有遇到任何问题 但是,今天我尝试添加一个新的迁移脚本,它非常长(超过1500行),并且遇到了一个奇怪的MySQL语法错误 我在MySQL Workbench中打开了这个脚本,没有报告语法错误,脚本执行时没有错误 此名为“V10012_uuinsert-acceptance-testing-event-moment-passed.sql”的脚本包含以下说明 插入语句1 插入语句2 INSERT语句LAST-1 最后插入语句 MySQL报告的错误如下: [错
- 插入语句1
- 插入语句2
- INSERT语句LAST-1
- 最后插入语句
- 我的脚本使用了大量的/**/注释
- Flyway Maven插件1.7
- Maven 2.0.3
- mysql:mysql连接器java:5.1.21
- MySQL 5.5.X
- Java JDK 1.7.0_09-b05
- 视窗7
我终于找到了问题的原因 在我的剧本中,我有:
...
...
/* INSERT statement LAST - 1 */
INSERT INTO `table_1` (`id`, `string_1`, `string_2`)
VALUES (
1,
'aaa', /* COMMENT 1*/
'bbb' /* COMMENT 2*/
);
/* INSERT statement LAST */
INSERT INTO `table_2` (`id`, `string_3`)
VALUES (
1, /* COMMENT 3 */
'cccc' /* COMMENT 4 */
);
问题似乎出现在注释2和注释4上。如果我删除主题,flyway将成功执行所有迁移脚本
例如,此脚本将工作:
...
...
/* INSERT statement LAST - 1 */
INSERT INTO `table_1` (`id`, `string_1`, `string_2`)
VALUES (
1,
'aaa', /* COMMENT 1*/
'bbb'
);
/* INSERT statement LAST */
INSERT INTO `table_2` (`id`, `string_3`)
VALUES (
1, /* COMMENT 3 */
'cccc'
);
那么,这可能是Flyway解析器中的一个bug
我今天没有时间测试它,但似乎只有在以下情况下才会出现此错误:
- 我们在VARCHAR(或者我想是其他字符串-列类型)后面有一个注释
- 此注释位于“')字符前面
/* INSERT statement LAST */
INSERT INTO `table_2` (`id`, `string_3`)
VALUES (
1, /* COMMENT 3 */
'cccc', /* COMMENT 4 */
'dddd'
);
此处注释3和注释4以Flyway方式传递,因为它们位于“,”之后和字符串值之前,但不位于“')”字符之前
希望这能有所帮助;-) 这是不太可能的,因为有飞行路线。这几乎肯定与flyway使用的MySQL驱动程序有关。使用MySql本地客户端,您自然会假设它可以处理任何法律语法。即使是“可选”注释块 我在MySql的jdbc驱动程序中肯定知道的一个问题是,它不能处理动态分隔符交换。因此,触发器和存储过程可能是一个问题,特别是如果它们是使用
mysqldump
生成的,但随后您使用Java应用程序重新摄取
如果您查看并转到spring.datasource.separator
,您将看到它在系统范围内(基本上)设置为代码>
现在想象一下,当脚本中出现这一行时,它将如何运行:
DELIMITER ;;
CREATE FUNCTION `int2vancode`(id BIGINT(20)) RETURNS varchar(255)
BEGIN
DECLARE num VARCHAR(10);
DECLARE length INT;
SET num = conv(id, 10, 36);
SET length = char_length(num);
return CONCAT(conv(length -1 , 10, 36), num);
END ;;
DELIMITER ;
java驱动程序是哑的,并且不会解释这些语句中的任何一条,即使分隔符
语句显然是针对客户机的
我现在遇到了一个问题,本地客户端执行每个脚本都没有问题,但是flyway说我有一个语法错误,连intellij都看不到
**更新**
我解决了我的问题,这或多或少证实了我所看到的问题:
我有一个创建表:
CREATE TABLE `Position` (
PositionID INT NOT NULL AUTO_INCREMENT,
`Name` varchar(200) COLLATE utf8_unicode_ci NOT NULL
);
我必须退出Name
和Position
,才能让flyway接受它,即使我迭代执行这些命令的bash脚本没有问题
也许我可以告诉Java驱动程序一些帮助它的方法?我也遇到了类似的问题。你的评论里没有引用任何话吗?