ActiveRecord :: StatementInvalid: PG InFailedSqlTransaction

J’essaie de créer un object ActiveRecord. Mais je reçois cette erreur lors de sa création.

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

Toutes les idées sur la question.

Aucune des autres réponses ne corrige la cause du problème.

Le problème est que lorsque Postgres lève une exception, il empoisonne les transactions futures sur la même connexion.

La solution consiste à annuler la transaction incriminée:

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

Voir référence

J’ai eu ce problème. Il suffit de redémarrer le serveur Rails et cela devrait fonctionner

Ce problème se produisait dans mon environnement de test et résultait du fait que chaque test était enveloppé dans sa propre transaction.

J’utilisais le joyau database_cleaner et je l’ai configuré de manière à ne PAS envelopper les tests dans une transaction s’ils utilisent JavaScript. Donc, pour résoudre le problème, j’ai ajouté js: true à chaque spécification à l’origine de ce problème. (Même si les spécifications n’utilisaient pas javascript, c’était le moyen le plus pratique de s’assurer que les tests ne seraient pas inclus dans une transaction. Je suis sûr qu’il ya moins de moyens de le faire, cependant).

Pour référence, voici la configuration database_cleaner de 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 

Si vous n’utilisez pas database_cleaner, la raison pour laquelle les tests seraient use_transactional_fixtures dans les transactions est probablement que l’option use_transactional_fixtures est définie sur true dans spec/spec_helper.rb . Essayez de le définir sur false.

vous pouvez voir ce qui se passe réellement dans le journal de postgresql, je passe beaucoup de temps à explorer ce problème, et enfin découvrir que nous utilisons mal les gemmes ascendantes causant une erreur de PG, seulement dans le journal postgresql

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

J’ai rencontré cette erreur lors du référencement d’une colonne dans mes spécifications qui n’existe plus. Assurez-vous que votre firebase database est à jour et que votre code n’attend pas une colonne qui n’existe pas.

Dans mon cas, j’ai reçu cette erreur simplement parce que je n’avais pas raté mon test db.

Dans mon cas, la configuration de Postgres dans /usr/local/var/postgres/postgresql.conf avait le type de données comme format international de dmy

Changer le type de données au format américain de mdy corrigé ce problème pour moi.

Problème:

  1. Le programme exécute une instruction SQL incorrecte. Une instruction SQL incorrecte est à l’origine du problème.
  2. Le programme ne fait pas ROLLBACK ou RELEASE SAVEPOINT immédiatement après une instruction SQL incorrecte.
  3. Le programme exécute des instructions SQL après une instruction SQL incorrecte.
  4. PostgreSQL ™ déclenche une erreur: la transaction en cours est abandonnée, les commandes sont ignorées jusqu’à la fin du bloc de transaction

Solution:

Recherchez une instruction SQL incorrecte et corrigez-la. Si vous ne souhaitez pas corriger l’instruction SQL, utilisez ROLLBACK ou RELEASE SAVEPOINT après une instruction SQL incorrecte.

Avait un problème similaire après la mise à niveau de Rails de 4.2.2 à 4.2.5, je devais mettre à jour pg gem et problème commencer à se produire

 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 a raison dans ce sens, pour résumer le problème:

Parfois, lorsque vous utilisez DatabaseCleaner.clean_with :deletion vous pouvez interférer avec la transaction PostgreSQL.

Donc, la solution pour moi était de remplacer DatabaseCleaner.clean_with :deletion dans les parties des tests où cela a été causé avec DatabaseCleaner.clean_with :truncation

Juste une dernière chose pour les gens googling. Si vous remarquez cette trace de stack:

 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... ^ 

… il peut être causé par ce problème

J’ai ce problème. Et j’ai découvert que c’était ma requête. Cela signifie que lorsque j’interroge avec association sans spécifier de colonne de table. ex:

 class Holiday < ApplicationRecord belongs_to :company end class Company < ApplicationRecord has_many :timeoffs end 

Dans le modèle de vacances, je demande

 company.timeoffs.where("(start_date <= ? and end_date >= ?) and id != ?", begin_date, begin_date, 1) 

L'erreur se produit parce que je n'ai pas spécifié l' id la table Cela a fonctionné pour moi après avoir changé le code pour

 company.timeoffs.where("(start_date <= ? and end_date >= ?) and time_offs.id != ?", begin_date, begin_date, 1)