(0.1ms) ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block
关于这个问题,有什么想法吗?
(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
请查看参考文献
Exception
中捕获异常,正如此处所述:https://dev59.com/R2kw5IYBdhLWcg3wNn-hException
是Ruby异常层次结构的根源,因此当您从Exception
中捕获异常时,您会捕获所有东西,包括子类,如SyntaxError、LoadError和Interrupt。 - adantjraise ActiveRecord::Rollback
进行回滚对我很有帮助。此外,参考 https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html。 - Al17我遇到了这个问题。只需要重新启动Rails服务器,就可以解决问题。
rake db:drop
+ rake db:create
+ rake db:migrate
解决了这个问题。可能是我在迁移方面搞错了。 - Noburake db:test:prepare
无法解决问题,但是RAILS_ENV=test rake db:drop db:create db:migrate
解决了这个问题。 - Martin Streicher这个问题是在我的测试环境中出现的,原因是每个测试都被包裹在自己的事务中。
我使用了database_cleaner gem,并将其配置为如果测试使用javascript,则不将测试包装在事务中。所以为了解决这个问题,我为导致此问题的每个spec添加了js: true
。(尽管实际上这些specs并没有使用javascript,但这是确保测试不会被包装在事务中最方便的方法。虽然我相信还有更少hack的方法可以做到)
供参考,这是来自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。
js:true
不同,您可以为集成规范设置它。请记住,在可行的情况下,使用:transaction
而不是:deletion
要慢得多,因此事务更可取。 - lobatiit
块中有两个像 get ...
的请求。将其移出可以解决此错误。 - Ryanjs: true
不是解决这个问题的最佳方法。它不能解决问题,而且删除策略非常缓慢。通过切换到事务策略,我将测试速度提高了2.5倍。请参见下面的答案。 - B Seven在我的规格说明中引用了一个不存在的列,导致我遇到了这个错误。请确保你的数据库是最新的,并且你的代码不会期望不存在的列。
问题:
解决方案:
找出错误的SQL语句并进行修正。 如果你不想修正SQL语句,可以在错误的SQL语句之后使用ROLLBACK或RELEASE SAVEPOINT。
/usr/local/var/postgres/postgresql.conf
,日期类型是国际格式dmy
。将日期类型更改为美国格式mdy
可以解决此问题。在我的情况下,我收到了这个错误,只是因为我没有 rake 我的测试数据库。
在将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))
Teddy Widom Answer 在这方面是正确的,总结一下问题:
有时候当你使用 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...
^
...这个问题可能是由此引起的
tail -f /usr/local/var/log/postgres.log
然后只需要复制错误并观察日志文件中的输出即可。
json
的 PSQL?将其更新至 PSQL 9.4 并使用jsonb
。问题解决! - germs12