当前位置: 首页 > 知识库问答 >
问题:

Flyway MySQL语法错误

太叔英卫
2023-03-14

自1个月以来,我们一直在使用Flyway,没有遇到任何问题。

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

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

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

  • 插入语句1
  • 插入语句2
  • 插入语句LAST-1
  • 最后插入语句

MySQL报告的错误如下:

com导致的[错误]。mysql。jdbc。例外情况。jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以了解使用near“INSERT INTO video\u feedback(id,youtube\u video\u id)value(1102,/*id*/”的正确语法,位于第232行[错误]com.googlecode.flyway.core.migration.MigrationException:迁移到版本10012失败!请还原备份并回滚数据库和代码!

该错误在“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\uu insert-acceptance-testing-event-moment-passed”中会出现什么问题呢。sql脚本?

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

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

  • 我的脚本使用了大量的/**/注释
  • Flyway Maven插件1.7
  • Maven 2.0.3
  • mysql:mysql连接器java:5.1.21
  • MySQL 5.5。X
  • Java JDK 1.7.0\U 09-b05
  • Windows 7

共有2个答案

贺聪
2023-03-14

由于flyway,这不太可能。这几乎肯定与flyway使用的MySQL驱动程序有关。使用MySql本机客户端,您自然会认为它可以处理任何法律语法。即使是“可选”注释块

我知道在MySql的jdbc驱动程序中,SURE的一个问题是它不能处理动态分隔符交换。因此触发器和存储过程可能是一个问题,特别是如果它们是使用mysqldump生成的,但随后您使用Java应用程序重新摄取。

如果您查看此处并转到spring。数据源。分隔符您将看到,这在系统范围内(基本上)设置为

现在想象一下,当脚本中出现这一行时,它将如何表现:

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
);

我必须退出flyway的Name和Position才能接受它,尽管我的bash脚本迭代执行这些脚本没有问题。

也许我可以告诉Java司机一些事情来帮助解决这个问题?

陶宏浚
2023-03-14

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

在我的剧本中,我有:

... 
...

/* 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(或其他字符串-列类型)后面有一条注释
  • 此注释位于“)”字符之前

只有在一个SQL脚本中存在多个insert语句时,才可能出现此问题。

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

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

此处,注释3和注释4以Flyway方式传递,因为它们位于“,”之后和字符串值之前,但不位于“)”字符之前。

希望这能有所帮助;-)

 类似资料:
  • 问题内容: 我在遵循MySQL语法指南时遇到语法错误。 我的查询是: 从逻辑上讲,这应该选择,但是我得到了 问题答案: 您的查询仅在存储过程/函数上下文中有效。参见那里以供参考。

  • 问题内容: 我最近在Java PreparedStatements中遇到了此问题。我有以下代码: 方法在哪里 但是,它总是抛出此错误: 当我以幼稚的方式执行“ …”时,不会发生此问题,但我希望以此方式进行。 任何帮助深表感谢。 更新 我尝试了社区的各种建议,例如 仍然出现错误信息。 问题答案: 解决问题的方法实际上非常简单,当您要调用PreparedStatement.executeQuery()

  • 我正在为我的数据库使用Sequelize(6.3.0)和sqlite3(4.2.0),并试图定义以下模型: 它应该在进程启动时定义,但我得到以下错误: 当然,每当我试图对此表执行任何操作时,都会出现以下错误: 我猜问题来自使用数组数据类型的“参与”和“赢家”行。 谢谢你的帮助

  • 问题内容: 我目前在我的Web应用程序中使用jQuery,Twitter Bootstrap和AngularJS。我一直在尝试进行路由,但是`Syntax error, unrecognized expression: 我需要在我的AngularJS路由中使用斜杠(即,并将在我的div中加载不同的内容)。可能是什么原因导致此错误? 问题答案: 我猜在指定目标时要多加斜杠。删除它们,它应该可以正常工

  • 我最近在Java PreparedStatements中遇到了这个问题。我有以下代码: 其中方法是 但是,它一直抛出这个错误: 当我以幼稚的方式做“...

  • 目前遇到此语法错误,错误发布在代码下方。 上面的代码,无法找出if语句上的语法错误。错误消息将很快粘贴为注释

  • 问题内容: 为什么Python在第9行的简单语句中给我一个语法错误? Python的版本是: 问题答案: 在Python 3中,print是一个函数,您需要像这样调用它。

  • 问题内容: 我正在尝试在Go中执行MERGE语句: 但是我得到了这个错误: 在MySQL中也是如此: 怎么了? 问题答案: 不支持,等效的是 插入…在重复的密钥更新上 尝试这个, 但请确保将其设置为或。