ActiveRecord :: StatementInvalid:PG InFailedSqlTransaction
我正在尝试创建一个ActiveRecord对象。但我在创建它时遇到了这个错误。
(0.1ms) ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block
关于这个问题的任何想法。
没有其他答案可以解决问题的根本原因 。
问题在于,当Postgres引发异常时,它会对同一连接中的未来事务施加毒害。
解决方法是回滚违规事务:
begin
ActiveRecord...do something...
rescue Exception => e
puts "SQL error in #{ __method__ }"
ActiveRecord::Base.connection.execute 'ROLLBACK'
raise e
end
参见参考。
我有这个问题。 只需重新启动Rails服务器,它应该工作
这个问题发生在我的测试环境中,并且是由于每个测试都被封装在自己的事务中。
我正在使用database_cleaner gem,并且配置它以便在事务中包装测试时不使用javascript。 所以为了解决这个问题,我在每个引起这个问题的规范中增加了js: true
。 (即使认为规范没有实际使用javascript,这是确保测试不会被包含在事务中的最方便的方法,但我相信这样做的方法更少)。
作为参考,这里是来自spec/support/database_cleaner.rb
的database_cleaner配置:
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with :deletion
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, :js => true) do
DatabaseCleaner.strategy = :deletion
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
如果您没有使用database_cleaner,那么测试将被包装在事务中的原因可能是spec/spec_helper.rb
中的use_transactional_fixtures
选项设置为true
。 尝试将其设置为false。
上一篇: ActiveRecord::StatementInvalid: PG InFailedSqlTransaction