ActiveRecord::StatementInvalid: PG InFailedSqlTransaction ActiveRecord::StatementInvalid: PG InFailedSqlTransaction postgresql postgresql

ActiveRecord::StatementInvalid: PG InFailedSqlTransaction


None of the other answers fix the root cause of the issue.

The problem is that when Postgres raises an exception, it poisons future transactions on the same connection.

The fix is to rollback the offending transaction:

begin  ActiveRecord...do something...rescue Exception => e  puts "SQL error in #{ __method__ }"  ActiveRecord::Base.connection.execute 'ROLLBACK'  raise eend

See reference.


I had this issue. Just restart the Rails Server and it should work


This issue was occurring in my test environment, and was caused by the fact that each test was wrapped in its own transaction.

I was using the database_cleaner gem, and have it configured so as NOT to wrap tests in a transaction if they use javascript. So to solve the issue, I added js: true to each spec that was causing this problem. (Even thought the specs did not actually use javascript, this was the most convenient way to ensure that the tests would not be wrapped in a transaction. I am sure there are less hack-ish ways of doing so, though).

For reference, here is the database_cleaner config from spec/support/database_cleaner.rb:

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  endend

If you are not using database_cleaner, then probably the reason the tests would be wrapped in transactions would be that the use_transactional_fixtures option is set to true in spec/spec_helper.rb. Try setting it to false.