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

FlywayDB:迁移失败,出现“错误执行语句”,但手动运行迁移SQL代码有效

韦宣
2023-03-14

我有一个play框架2.2.2 scala应用程序并使用play-flyway 1.0.3。

以下迁移应通过flyway运行:

ALTER TABLE  `user_visits` ADD  `FirstSiteRequestTime` DATETIME NOT NULL ;
UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1) ;

因此,我将一列添加到表中,然后使用更新语句以编程方式填充它。

第一行执行良好,但update statemens失败

FlywaySqlScriptException: Error executing statement at line 2: UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1)
com.googlecode.flyway.core.command.FlywaySqlScriptException: Error executing statement at line 2: UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1)
com.googlecode.flyway.core.dbsupport.SqlScript.execute(SqlScript.java:92)
com.googlecode.flyway.core.resolver.sql.SqlMigrationExecutor.execute(SqlMigrationExecutor.java:72)
com.googlecode.flyway.core.command.DbMigrate$2.doInTransaction(DbMigrate.java:243)
com.googlecode.flyway.core.command.DbMigrate$2.doInTransaction(DbMigrate.java:241)
com.googlecode.flyway.core.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:72)

然而,当我使用迁移SQL代码并使用phpmyadmin运行它时,它工作得很好(虽然运行需要2-5秒,但表相当大)。

我的mysql。日志看起来像

                  128 Query SET autocommit=0
                  128 Query ALTER TABLE  `user_visits` ADD  `FirstSiteRequestTime` DATETIME NOT NULL
140412  4:40:43   128 Query UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1)
140412  4:40:44   128 Query rollback
                  128 Query SET autocommit=1

flyway有没有超时?日志文件显示它将查询发送到mysql服务器,然后回滚。为什么?如前所述,查询是正确的。当我手动运行它时,它会工作。

编辑:

运行迁移后,执行并提交了ALTER TABLE语句(表被更改),尽管mysql。日志显示它已回滚。第二个命令真的被撤回了。

我还尝试在两次迁移中拆分两个SQL命令。然后第一个(ALTER TABLE)运行正常,第二个失败。

编辑2:

这可能是某种超时问题。使其执行得更快(仅通过更新某些行)

ALTER TABLE  `user_visits` ADD  `FirstSiteRequestTime` DATETIME NOT NULL ;
UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1) WHERE user_visits.id<1000;

正确运行,也在飞行途中。

共有1个答案

卢普松
2023-03-14

MySQL文档指出,在MySQL 5.5.3中,“大多数语句”在执行前会导致隐式提交,而在执行后也会导致隐式提交。这似乎包括ALTER TABLE语句(在MySQL 5.5.3及更高版本中)。

请注意,在问题中显示的日志中,禁用了自动提交。当然,在如下语句之间使用显式提交:

ALTER TABLE  `user_visits` ADD  `FirstSiteRequestTime` DATETIME NOT NULL ;
COMMIT ;
UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1) ;

或者将它们放置在单独且连续的迁移文件中,如下所示:

文件V1\uu alter\u table。sql:

ALTER TABLE  `user_visits` ADD  `FirstSiteRequestTime` DATETIME NOT NULL ;

文件V2__update_table.sql:

UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1) ;
 类似资料:
  • 我已经为工作中的应用程序创建了一个flyway项目。事实证明,在我准备好flyway设置进行测试之前,其中一个开发人员已经在测试中执行了一些SQL语句。 我的sql脚本有几个语句: 应该在语句#2上删除的列已经在我们的TEST实例上手动删除。它还没有被删除在我们的PROD实例上,我想通过迁移而不是手动进行。 显然,如果不先在测试中进行测试,我不会在PROD上运行迁移(有比这三个查询多得多的东西)。

  • 我正在flyway的CMD中运行命令,但脚本文件的迁移会出现以下异常 [错误]无法执行目标组织。flywaydb:flyway maven插件:3.2.1:在convertopia auto db:org项目上迁移(默认cli)。flywaydb。果心应用程序编程接口。FlywayException:验证失败。迁移1.0.53的迁移描述不匹配[错误]- 我尝试过,它说构建成功,但问题仍然没有解决。

  • 在类路径中:/db。迁移有迁移但flyway没有看到这一点,而是爱上了msg 2022-05-02 17:28:07.993INFO 45296 --- [ restartedMain]c. c. c. ConfigServiceProperty tySourceLocator:从服务器获取配置,地址为:http://localhost:8888/story2022-05-02 17:28:08.

  • 我正在使用Android Studio 3.2 Canary 14,并试图迁移现有项目以使用AndroidX。从https://developer.android.com/topic/libraries/support-library/androidx-rn听起来,我必须设置(这是在选择“重构到AndroidX…”选项时自动完成的)。我还将目标API级别更新为28。还有人看到这个问题吗? 未能转换

  • This manual migration process should be run after the automated migration process, to complete the missing parts, or debug issues in the migration CLI output. Project setup package.json Scoped package

  • 我有一个问题启动我的Java应用程序 liqibase更新出错: