ActiveRecord:: StatementInvalid: PG InFailedSqlTransaction
Я пытаюсь создать объект ActiveRecord.Но я получаю эту ошибку при ее создании.
(0.1ms) ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block
любые идеи людей по этому вопросу.
10 ответов:
ни один из других ответов исправить причины вопроса.
проблема в том, что когда Postgres вызывает исключение, оно отравляет будущие транзакции на том же соединении.
исправление заключается в откате нарушающей транзакции:
begin ActiveRecord...do something... rescue Exception => e puts "SQL error in #{ __method__ }" ActiveRecord::Base.connection.execute 'ROLLBACK' raise e end
посмотреть ссылка.
эта проблема возникла в моей тестовой среде и была вызвана тем, что каждый тест был завернут в свою собственную транзакцию.
я использовал 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
наspec/spec_helper.rb
. Попробуйте установить его в false.
вы можете увидеть, что на самом деле происходит в журнале postgresql, я трачу много времени, чтобы копаться в этой проблеме, и, наконец, узнать, что мы злоупотребляем upsert gem вызывают ошибку PG, только в журнале postgresql есть реальная информация о том, что происходит
Я столкнулся с этой ошибкой при ссылке на столбец в моих спецификациях, который больше не существует. Убедитесь, что ваша база данных обновлена, и ваш код не ожидает столбец, который не существует.
в моем случае конфигурация Postgres в
/usr/local/var/postgres/postgresql.conf
имел тип даты как международный форматdmy
изменение типа даты на американский формат
mdy
исправлена эта проблема для меня.
:
- программа выполняет неверную инструкцию SQL. Неправильный оператор SQL является основной причиной проблемы.
- программа не откатывает и не освобождает точку сохранения сразу после неправильного оператора SQL.
- программа выполняет инструкции SQL после неправильного оператора SQL.
- в PostgreSQL возникает ошибка: текущая транзакция прерывается, команды игнорируется до конца блока транзакции
устранение:
найти неверный оператор SQL и исправить его. Если вы не хотите исправлять инструкцию SQL, используйте ROLLBACK или RELEASE SAVEPOINT после неправильного оператора SQL.
была аналогичная проблема после обновления рельсов с 4.2.2 до 4.2.5 мне пришлось обновить
pg
камень и проблема начинают происходить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
в Holiday model I query
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)