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 и настроил его так, чтобы не переносить тесты в транзакцию, если они используют 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, используйте откат или отпустите точку сохранения после неправильной инструкции SQL.
была аналогичная проблема после обновления рельсов с 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...
^
...это может быть вызвано этой проблемой
у меня есть эта проблема. И я узнал, что это был мой запрос. Это означает, когда я запрашиваю ассоциацию без указания столбца таблицы. ex:
class Holiday < ApplicationRecord
belongs_to :company
end
class Company < ApplicationRecord
has_many :timeoffs
end
в Holiday model I запрос
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)