一个后置钩子出现错误,来自 Rspec 的 PG::InFailedSqlTransaction 错误

9
我试图从模型 spec 文件运行 rspec,但是我遇到了这个错误:“在 after hook 中发生了一个错误”。

“在 after hook 中发生了一个错误 PG::InFailedSqlTransaction: ERROR: 当前事务已中止,命令将被忽略直到事务结束。发生于 C:/Ruby193/lib/.../postgresql_adapter:294”

我在谷歌上搜索了一下这个问题,并发现有人建议将我的“database_cleaner”降级到“1.0.1”。我尝试了,但是没有成功。请问有人知道如何解决吗?提前感谢!
1个回答

22

如果您在事务范围内执行了错误的SQL语句,然后从该语句中捕获异常,并尝试在同一事务中执行另一个SQL语句,则可能会发生这种情况。

一旦事务中的一个语句失败,就不能再执行任何其他语句。

以下是一个示例:

ActiveRecord::Base.transaction do
  begin
    ActiveRecord::Base.connection.execute "A bad query"
  rescue => ex 
    puts ex.message
  end
  puts User.count
end

User.count 返回 PG::InFailedSqlTransaction,因为之前的 SQL 语句引发了 ActiveRecord::StatementInvalid 异常,并被 rescue 捕获。

因此,我会寻找在事务范围内捕获异常并尝试运行其他 SQL 语句的代码。


1
这个错误发生在我的ActiveRecord回调中,如果我理解正确的话,所有回调都包含在一个事务中,如何确定哪一个是根本原因?(同时我检查了源代码,并没有在源代码中找到rescue - Ryan Lyu
@Ryan Lyu, 你找到任何解决办法了吗? - HFX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接