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

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


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


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

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

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, используйте откат или отпустите точку сохранения после неправильной инструкции 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)