我们从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
[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'
);
我今天没时间测试它,但似乎只有在以下情况下才会出现此错误:
>我们在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] 举报,一经查实,本站将立刻删除。