我正在尝试创建一个ActiveRecord Object。但是在创建它时遇到了这个错误。
(0.1ms) ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block
关于这个问题的任何想法。
我正在尝试创建一个ActiveRecord Object。但是在创建它时遇到了这个错误。
(0.1ms) ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block
关于这个问题的任何想法。
Answers:
其他答案都无法解决问题的根本原因。
问题是,当Postgres引发异常时,它会使同一连接上的将来交易中毒。
解决方法是回滚有问题的事务:
begin
ActiveRecord...do something...
rescue Exception => e
puts "SQL error in #{ __method__ }"
ActiveRecord::Base.connection.execute 'ROLLBACK'
raise e
end
参见参考。
Exception
这里救援,如此处所述:stackoverflow.com/questions/10048173/…Exception 是Ruby异常层次结构的根,因此,当您救援Exception时,您会从所有内容中进行救援,包括SyntaxError,LoadError和Interrupt等子类。
我有这个问题。只需重新启动Rails Server,它应该可以工作
rake db:drop
+ rake db:create
+rake db:migrate
解决了这个问题。也许我搞砸了迁移。
ROLLBACK
才能退出当前事务。
rake db:test:prepare
没有用-但是RAILS_ENV=test rake db:drop db:create db:migrate
解决了问题。
此问题是在我的测试环境中发生的,并且是由于每个测试都包装在自己的事务中这一事实引起的。
我使用的是database_cleaner gem,并对其进行了配置,以便如果测试使用JavaScript,则不将测试包装在事务中。因此,为了解决该问题,我将js: true
每个导致此问题的规范添加到了其中。(即使以为规范并未真正使用javascript,这也是确保测试不会被封装在事务中的最便捷方法。不过,我敢肯定,这样做的方式不多。
作为参考,这是来自的database_cleaner配置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
end
end
如果您不使用database_cleaner,则可能将测试包装在事务中的原因可能是该use_transactional_fixtures
选项设置为true
in spec/spec_helper.rb
。尝试将其设置为false。
js: true
您可以为集成规范设置它,而不是为每个不能按预期运行的规范设置。请记住,使用:deletion
而不是使用:transaction
速度要慢得多,因此在可行的情况下最好进行事务处理。
get ...
在同it
一块中一样。将其移出可解决此错误。
js: true
解决此问题的最佳方法。它不能解决问题,删除策略非常慢。通过切换到交易策略,我的测试速度提高了2.5倍。请参阅下面的答案。
您可以看到postgresql日志中真正发生的事情,我花了很多时间来研究这个问题,最后发现我们滥用了upsert gem导致PG错误,只有在postgresql日志中才有正在发生的事情的真实信息。
在将Rails从4.2.2升级到4.2.5后出现了类似的问题,我不得不升级pg
gem并开始发生问题
9) WorkPolicy#is_publicly_viewable? is publicly visible hides work if deleted
Failure/Error: before { DatabaseCleaner.clean_with :deletion }
ActiveRecord::StatementInvalid:
PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block
: SELECT tablename
FROM pg_tables
WHERE schemaname = ANY (current_schemas(false))
泰迪·温德姆答案 从这个意义上来说,是正确的,仅是为了总结一下问题:
有时当您使用 DatabaseCleaner.clean_with :deletion
时可能会干扰PostgreSQL事务。
所以对我来说解决方案是更换 DatabaseCleaner.clean_with :deletion
部分测试导致的DatabaseCleaner.clean_with :truncation
对于谷歌搜索人员来说,又是一件事。如果您注意到此堆栈跟踪:
An error occurred in an `after(:context)` hook.
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "table_rows" does not exist
LINE 1: ...ion_schema.tables WHERE table_schema = 'test' AND table_rows...
^
...可能是这个问题引起的
我有那个问题。我发现这是我的查询。这意味着当我使用关联查询而不指定表列时。例如:
class Holiday < ApplicationRecord
belongs_to :company
end
class Company < ApplicationRecord
has_many :timeoffs
end
在假日模型中,我查询
company.timeoffs.where("(start_date <= ? and end_date >= ?) and id != ?", begin_date, begin_date, 1)
发生错误是因为我没有指定将哪个表id
更改为
company.timeoffs.where("(start_date <= ? and end_date >= ?) and time_offs.id != ?", begin_date, begin_date, 1)
json
吗?将其更新为PSQL 9.4并使用jsonb
。问题解决了!