Flyway MySQL语法错误

Bap*_*ard 5 mysql jdbc flyway

我们使用 Flyway 1 个月以来没有遇到任何问题。

但是,今天我尝试添加一个非常长(超过1500行)的新迁移脚本,并遇到了一个奇怪的MySQL语法错误。

我在 MySQL Workbench 中打开这个脚本,没有报告语法错误,脚本执行没有错误。

这个名为“V10012__insert-acceptance-testing-event-moment-passed.sql”的脚本包含以下说明。

  • 插入语句1
  • 插入语句2
  • ...
  • INSERT 语句最后 - 1
  • 最后插入语句

MySQL报告的错误如下:

[错误] 由 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException 引起:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 232 行的 'INSERT INTO video_feedback (id, youtube_video_id) VALUES ( 1102, /* id */' at line 232 [ERROR] com.googlecode.flyway.core. migration.MigrationException:迁移到版本 10012 失败!请恢复备份并回滚数据库和代码!

该错误是在“INSERT statements LAST”语句上报告的。

但是,如果我在脚本中反转“INSERT 语句 LAST”和“INSERT 语句 LAST - 1”,则会在“INSERT 语句 LAST - 1”(现在位于文件末尾)上报告错误。所以我在“INSERT statements LAST”中没有错误,因为 Flyway 成功执行了它。

另外,如果现在我从脚本“V10012_ insert-acceptance-testing-event-moment-passed.sql”中完全删除“INSERT statements LAST”语句,并将该语句放入名为“V10013 _test.sql”的新文件中,flyway 会执行我所有的迁移脚本都成功了!

那么,我最初的“V10012__insert-acceptance-testing-event-moment-passed.sql”脚本中可能存在什么问题?

是否存在脚本大小限制?

以下是有关我的环境的有用信息:

  • 我的脚本使用了大量 /* */ 注释
  • Flyway Maven 插件 1.7
  • Maven 2.0.3
  • mysql:mysql-connector-java:5.1.21
  • MySQL 5.5.X
  • Java JDK 1.7.0_09-b05
  • Windows 7的

Bap*_*ard 4

我终于找到了问题的原因。

在我的脚本中我有:

... 
...

/* 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    */
);
Run Code Online (Sandbox Code Playgroud)

问题似乎出在评论 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'   
);
Run Code Online (Sandbox Code Playgroud)

那么,这也许是 Flyway 解析器内部的一个错误?

我今天没有时间测试它,但似乎只有在以下情况下才会发生此错误:

  • 我们在 VARCHAR (或我认为的其他字符串列类型)之后有一个注释
  • 该注释位于“)”字符之前

这一问题似乎只有在一个 SQL 脚本中存在多个插入语句时才会重现。

此外,我认为未放在“)”之前的注释是正确的,例如:

/* INSERT statement LAST */
INSERT INTO `table_2` (`id`, `string_3`)
VALUES (
    1,   /* COMMENT 3   */
    'cccc',  /* COMMENT 4   */
    'dddd'
);
Run Code Online (Sandbox Code Playgroud)

这里,COMMENT 3 和 COMMENT 4 在 Flyway 中传递,因为它们位于“,”之后、字符串值之前,但没有放置在“)”字符之前。

希望这能有所帮助;-)