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 55

10 ответов:

ни один из других ответов исправить причины вопроса.

проблема в том, что когда Postgres вызывает исключение, оно отравляет будущие транзакции на том же соединении.

исправление заключается в откате нарушающей транзакции:

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

  raise e
end

посмотреть ссылка.

У меня была эта проблема. Просто перезапустите сервер Rails, и он должен работать

эта проблема возникла в моей тестовой среде и была вызвана тем, что каждый тест был завернут в свою собственную транзакцию.

я использовал 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 есть реальная информация о том, что происходит

https://github.com/seamusabshere/upsert/issues/39

Я столкнулся с этой ошибкой при ссылке на столбец в моих спецификациях, который больше не существует. Убедитесь, что ваша база данных обновлена, и ваш код не ожидает столбец, который не существует.

в моем случае я получил эту ошибку просто потому, что я не сгреб свою тестовую БД.

в моем случае конфигурация Postgres в /usr/local/var/postgres/postgresql.conf имел тип даты как международный формат dmy

изменение типа даты на американский формат mdy исправлена эта проблема для меня.

:

  1. программа выполняет неверную инструкцию SQL. Неправильный оператор SQL является основной причиной проблемы.
  2. программа не откатывает и не освобождает точку сохранения сразу после неправильного оператора SQL.
  3. программа выполняет инструкции SQL после неправильного оператора SQL.
  4. в 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)