ActiveRecord错误:SAVEPOINT active_record_1不存在

Duk*_*ver 22 mysql activerecord ruby-on-rails

完整的错误是

ActiveRecord::StatementInvalid: Mysql2::Error: SAVEPOINT active_record_1 does not exist: ROLLBACK TO SAVEPOINT active_record_1
Run Code Online (Sandbox Code Playgroud)

每当我尝试创建一个新的ActiveRecord对象时,我正在编写单元测试并收到此错误 - 但仅在某个点之后.这些行发生在以下行之后:

ActiveRecord::Base.connection.execute "DROP TABLE IF EXISTS foo"
ActiveRecord::Base.connection.execute "CREATE TABLE foo (id INTEGER PRIMARY KEY)"
Run Code Online (Sandbox Code Playgroud)

(如果测试成功,表'foo'将填充数据)

在上面的行之前,我可以写一些类似的东西

User.create(email => 'foo@bar.com')
Run Code Online (Sandbox Code Playgroud)

一切正常.但是,如果我在调用ActiveRecord :: Base.connection.execute之后尝试编写上面的行,那么我会得到上面描述的SAVEPOINT错误.我也尝试将我的执行语句放在一个事务中,但这没有帮助.我很难过.

仅供参考 - 我正在使用Rails 3.2.8

awa*_*age 21

您正在使用Mysql DDE语句(create/drop/truncate table),这将导致隐式提交.

由于隐式提交,将删除当前事务的所有保存点(请参阅上面的文档).

要解决此问题,您可以关闭事务并使用DatabaseCleaner(截断模式).


小智 7

解决这个问题..

config.use_transactional_fixtures = false

  • 这个答案对我有用。我在 `ActiveSupport::TestCase` 的子类中声明了 `self.use_transactional_fixtures = false`。 (2认同)