微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flyway MySQL语法错误

我们从1个月开始使用Flyway而没有遇到任何问题.

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

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

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

  • INSERT statement 1
  • INSERT statement 2
  • INSERT statement LAST – 1
  • INSERT statement LAST

MysqL报告的错误如下:

[ERROR] Caused by
com.MysqL.jdbc.exceptions.jdbc4.MysqLSyntaxErrorException: You have an
error in your sql Syntax; check the manual that corresponds to your
MysqL server version for the right Syntax to use near ‘INSERT INTO
video_Feedback (id, youtube_video_id) VALUES ( 1102, /* id */’
at line 232 [ERROR]
com.googlecode.flyway.core.migration.MigrationException: Migration to
version 10012 Failed! Please restore backups and roll back database
and code!

在“INSERT语句LAST”语句中报告错误.

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

此外,如果现在我从脚本’V10012_insert-acceptance-testing-event-moment-passed.sql’中完全删除’INSERT语句LAST’语句并将此语句放入名为’V10013_test.sql’的新文件中,flyway将执行我的所有操作迁移脚本成功!

那么,我最初的’V10012__insert-acceptance-testing-event-moment-passed.sql’脚本可能会出现什么问题?

是否有可能的脚本大小限制?

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

  • My scripts uses lots of /* */ comments
  • Flyway Maven Plugin 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

解决方法:

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

在我的剧本中我有

... 
...

/* 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解析器中的一个错误

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

>我们在VARCHAR之后发表评论(或者我认为其他字符串列类型)
>此评论位于’)’字符之前

如果一个sql脚本中存在多个insert语句,则此问题似乎只能重现.

此外,我认为没有放在’)’之前的评论是正确的,例如:

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

这里的评论3和评论4在Flyway中传递,因为它们位于’,’之后,在字符串值之前,但它们没有放在’)’字符之前.

希望这可以帮助;-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐