ActiveRecord:: StatementInvalid: PG InFailedSqlTransaction
Я пытаюсь создать объект ActiveRecord. Но я получаю эту ошибку при ее создании.
(0.1ms) ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block
Любые идеи, касающиеся этой проблемы.
Ответы
Ответ 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)
какие-либо предложения?