wake-up-neo.net

ActiveRecord :: StatementInvalid: PG InFailedSqlTransaction

Ich versuche, ein ActiveRecord-Objekt zu erstellen. Aber ich erhalte diesen Fehler beim Erstellen.

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

Irgendwelche Ideen Leute bezüglich des Problems.

58
untwal

Keine der anderen Antworten behebt das Problem Grundursache.

Das Problem ist, dass Postgres, wenn eine Ausnahme ausgelöst wird, zukünftige Transaktionen auf derselben Verbindung vergiftet.

Die Lösung besteht darin, die beanstandete Transaktion rückgängig zu machen:

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

  raise e
end

Siehe reference .

85
B Seven

Ich hatte dieses Problem. Starten Sie einfach den Rails Server neu und es sollte funktionieren

78
Furkan Ayhan

Dieses Problem trat in meiner Testumgebung auf und wurde durch die Tatsache verursacht, dass jeder Test in eine eigene Transaktion eingeschlossen wurde.

Ich habe den database_cleaner gem verwendet und habe ihn so konfiguriert, dass er Tests NICHT in eine Transaktion einschließt, wenn er Javascript verwendet. Um das Problem zu lösen, habe ich js: true zu jeder Spezifikation hinzugefügt, die dieses Problem verursacht hat. (Auch wenn die Spezifikationen eigentlich kein Javascript verwendet haben, war dies der bequemste Weg, um sicherzustellen, dass die Tests nicht in eine Transaktion eingeschlossen werden. Ich bin jedoch sicher, dass es weniger hackhafte Möglichkeiten gibt, dies zu tun.).

Als Referenz dient hier die database_cleaner-Konfiguration von 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

Wenn Sie database_cleaner nicht verwenden, liegt der Grund für die Tests, die in Transaktionen eingeschlossen werden, wahrscheinlich darin, dass die use_transactional_fixtures-Option in spec/spec_helper.rb auf true gesetzt ist. Setzen Sie es auf "false".

14
Teddy Widom

sie können sehen, was wirklich in Postgresql Log los ist. Ich verbringe viel Zeit, um Dig in diese Ausgabe zu bringen, und finde schließlich heraus, dass wir missbrauchen, dass ein Ups-Gem einen PG-Fehler verursacht 

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

7
William Herry

Dieser Fehler ist aufgetreten, wenn auf eine Spalte in meinen Spezifikationen verwiesen wird, die nicht mehr vorhanden ist. Stellen Sie sicher, dass Ihre Datenbank auf dem neuesten Stand ist und Ihr Code keine Spalte erwartet, die nicht vorhanden ist.

5
lobati

In meinem Fall habe ich diesen Fehler erhalten, nur weil ich meine Test-Datenbank nicht rake'd hatte. 

2
nfriend21

Problem:

  1. Das Programm führt eine falsche SQL-Anweisung aus. Eine falsche SQL-Anweisung ist die Hauptursache des Problems.
  2. Das Programm ROLLBACK oder RELEASE SAVEPOINT nicht sofort nach einer falschen SQL-Anweisung.
  3. Das Programm führt SQL-Anweisungen nach falscher SQL-Anweisung aus.
  4. PostgreSQL führt zu FEHLER: Die aktuelle Transaktion wird abgebrochen, die Befehle werden bis zum Ende des Transaktionsblocks ignoriert 

Lösung:

Suchen Sie nach einer falschen SQL-Anweisung und korrigieren Sie diese. Wenn Sie die SQL-Anweisung nicht korrigieren möchten, verwenden Sie nach einer falschen SQL-Anweisung ROLLBACK oder RELEASE SAVEPOINT.

2
John Doe

In meinem Fall hatte die Postgres-Konfiguration bei /usr/local/var/postgres/postgresql.conf den Datentyp als internationales Format von dmy.

Das Ändern des Datentyps in das amerikanische Format mdy hat dieses Problem für mich behoben.

2
Winsor

Hatte ein ähnliches Problem nach dem Upgrade von Rails von 4.2.2 auf 4.2.5. Ich musste pg gem aufrüsten und das Problem begann

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 ist in diesem Sinne richtig, nur um das Problem zusammenzufassen:

Wenn Sie DatabaseCleaner.clean_with :deletion verwenden, stören Sie manchmal die PostgreSQL-Transaktion. 

Für mich bestand die Lösung darin, DatabaseCleaner.clean_with :deletion in Teilen des Tests, wo dies durch DatabaseCleaner.clean_with :truncation verursacht wurde, zu ersetzen.

Nur noch eine Sache für Leute, die googeln. Wenn Sie diese Stack-Ablaufverfolgung feststellen:

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

... kann durch dieses Problem verursacht werden

0
equivalent8

Ich habe das Problem. Und ich habe herausgefunden, dass es meine Abfrage war Dies bedeutet, wenn ich mit Assoziation frage, ohne eine Tabellenspalte anzugeben.

class Holiday < ApplicationRecord
     belongs_to :company
end

class Company < ApplicationRecord
    has_many :timeoffs
end

Im Urlaubsmodell frage ich ab

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

Der Fehler tritt auf, weil ich nicht angegeben habe, in welcher Tabelle id Es funktionierte für mich, nachdem ich den Code geändert hatte

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