Подтвердить что ты не робот

ActiveRecord:: StatementInvalid: PG InFailedSqlTransaction

Я пытаюсь создать объект ActiveRecord. Но я получаю эту ошибку при ее создании.

(0.1ms)  ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR:  current transaction is       aborted, commands ignored until end of transaction block

Любые идеи, касающиеся этой проблемы.

4b9b3361

Ответ 1

Ни один из других ответов не устраняет проблему root проблемы.

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

Исправление состоит в откате транзакции с нарушением:

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

  raise e
end

См. ссылка.

Ответ 2

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

Ответ 3

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

Я использовал массив 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.

Ответ 4

вы можете видеть, что происходит в журнале postgresql, я трачу много времени, чтобы разобраться в этой проблеме, и, наконец, узнаем, что мы неправильно используем драгоценный камень upsert, вызывающий ошибку PG, только в журнале postgresql есть реальная информация о том, что продолжая

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

Ответ 5

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

Ответ 6

Проблема:

  • Программа выполняет неверный оператор SQL. Неправильная инструкция SQL является основной причиной проблемы.
  • Программа не ROLLBACK или RELEASE SAVEPOINT сразу после неправильного оператора SQL.
  • Программа выполняет инструкции SQL после неправильного оператора SQL.
  • PostgreSQL вызывает ERROR: текущая транзакция прерывается, команды игнорируются до конца блока транзакций

Решение:

Найдите неправильный оператор SQL и исправьте его. Если вы не хотите исправлять инструкцию SQL, используйте ROLLBACK или RELEASE SAVEPOINT после неправильной инструкции SQL.

Ответ 7

В моем случае я получил эту ошибку просто потому, что не использовал rake'd мой тест db.

Ответ 8

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

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

Ответ 9

Сходная проблема возникла после обновления 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...
^

... это может быть вызвано этой проблемой

Ответ 10

У меня эта проблема. И я узнал, что это мой запрос. Это означает, что при запросе с ассоциацией не указывается столбец таблицы. например:

class Holiday < ApplicationRecord
     belongs_to :company
end

class Company < ApplicationRecord
    has_many :timeoffs
end

В модели Holiday я запрошу

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)

Ответ 11

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

    cur = con.cursor()
    query="select * from public.irisdata ;"
    cur.execute(query)

какие-либо предложения?