【发布时间】:2014-05-26 08:57:01
【问题描述】:
我有一个 play framework 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) ;
所以我向表中添加一列,然后使用更新语句以编程方式填充它。
第一行执行良好,但更新语句失败
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.log 看起来像
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.log 说它已回滚。第二个命令真的回滚了。
我还尝试在两个迁移中拆分两个 SQL 命令。然后第一个(ALTER TABLE)运行良好,第二个失败。
edit2:
这可能是某种超时问题。让它执行得更快(只更新一些行)
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;
运行正常,也在飞行路线中。
【问题讨论】:
标签: mysql scala playframework database-migration flyway