Ich versuche, ein ActiveRecord-Objekt zu erstellen. Beim Erstellen wird jedoch dieser Fehler angezeigt.
(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.
json
? Aktualisiere es auf PSQL 9.4 und benutze esjsonb
. Problem gelöst!Antworten:
Keine der anderen Antworten behebt die Grundursache des Problems.
Das Problem ist, dass Postgres, wenn es eine Ausnahme auslöst, zukünftige Transaktionen auf derselben Verbindung vergiftet.
Das Update besteht darin, die betreffende Transaktion zurückzusetzen:
begin ActiveRecord...do something... rescue Exception => e puts "SQL error in #{ __method__ }" ActiveRecord::Base.connection.execute 'ROLLBACK' raise e end
Siehe Referenz .
quelle
Exception
, wie hier angegeben: stackoverflow.com/questions/10048173/… Ausnahme ist die Wurzel der Ausnahmehierarchie von Ruby. Wenn Sie also Ausnahme retten, retten Sie vor allem, einschließlich Unterklassen wie SyntaxError, LoadError und Interrupt.Ich hatte dieses Problem. Starten Sie einfach den Rails Server neu und es sollte funktionieren
quelle
rake db:drop
+rake db:create
+ hatrake db:migrate
das Problem gelöst. Vielleicht habe ich die Migration durcheinander gebracht.ROLLBACK
die aktuelle Transaktion zu beenden.rake db:test:prepare
hat nicht funktioniert - aber a hatRAILS_ENV=test rake db:drop db:create db:migrate
das Problem gelöst.Dieses Problem trat in meiner Testumgebung auf und wurde durch die Tatsache verursacht, dass jeder Test in eine eigene Transaktion eingeschlossen war.
Ich habe das Juwel database_cleaner verwendet und es so konfiguriert, dass Tests NICHT in eine Transaktion eingeschlossen werden, wenn sie Javascript verwenden. Um das Problem zu lösen, habe ich
js: true
zu jeder Spezifikation hinzugefügt , die dieses Problem verursacht hat. (Auch wenn in den Spezifikationen kein Javascript verwendet wurde, war dies der bequemste Weg, um sicherzustellen, dass die Tests nicht in eine Transaktion eingebunden werden. Ich bin mir jedoch sicher, dass es weniger hackartige Möglichkeiten gibt, dies zu tun.)Als Referenz finden Sie hier die Datenbankdatenbank-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 sich nicht mit database_cleaner sind, dann ist wahrscheinlich der Grund , warum die Tests in Transaktionen verpackenden würde wäre, dass die
use_transactional_fixtures
Option eingestellt isttrue
inspec/spec_helper.rb
. Versuchen Sie es auf false zu setzen.quelle
js: true
für jede Spezifikation festzulegen, die nicht wie erwartet funktioniert, können Sie sie für Integrationsspezifikationen festlegen. Beachten Sie, dass die Verwendung von:deletion
anstelle von:transaction
viel langsamer ist. Daher sind Transaktionen nach Möglichkeit vorzuziehen.get ...
im selbenit
Block hatte. Durch Verschieben wurde dieser Fehler behoben.js: true
der beste Weg ist, um dieses Problem zu beheben. Das Problem wird dadurch nicht gelöst, und die Löschstrategie ist sehr langsam . Durch den Wechsel zur Transaktionsstrategie habe ich meine Tests um das 2,5-fache beschleunigt. Siehe meine Antwort unten.Sie können sehen, was wirklich im Postgresql-Protokoll vor sich geht. Ich verbringe viel Zeit damit, mich mit diesem Problem zu befassen, und finde schließlich heraus, dass wir Upsert Gem missbrauchen, um einen PG-Fehler zu verursachen. Nur im Postgresql-Protokoll haben Sie die wirklichen Informationen darüber, was los ist
https://github.com/seamusabshere/upsert/issues/39
quelle
Ich bin auf diesen Fehler gestoßen, wenn ich auf eine Spalte in meinen Spezifikationen verweise, 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.
quelle
Problem:
Lösung:
Suchen Sie eine falsche SQL-Anweisung und korrigieren Sie sie. Wenn Sie die SQL-Anweisung nicht korrigieren möchten, verwenden Sie nach einer falschen SQL-Anweisung ROLLBACK oder RELEASE SAVEPOINT.
quelle
In meinem Fall habe ich diesen Fehler nur erhalten, weil ich meine Test-Datenbank nicht geharkt hatte.
quelle
In meinem Fall hatte die Postgres-Konfiguration bei
/usr/local/var/postgres/postgresql.conf
den Datentyp als internationales Format vondmy
Durch Ändern des Datentyps in das amerikanische Format wurde
mdy
dieses Problem für mich behoben.quelle
Hatte ein ähnliches Problem nach dem Upgrade von Rails von 4.2.2 auf 4.2.5 Ich musste Gem aktualisieren
pg
und das Problem trat auf9) 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, um das Problem zusammenzufassen:
Manchmal
DatabaseCleaner.clean_with :deletion
stören Sie bei der Verwendung möglicherweise die PostgreSQL-Transaktion.Die Lösung für mich bestand also darin,
DatabaseCleaner.clean_with :deletion
Teile der Tests zu ersetzen, bei denen dies verursacht wurdeDatabaseCleaner.clean_with :truncation
Nur noch eine Sache, um Leute zu googeln. Wenn Sie diesen Stack-Trace bemerken:
... kann durch dieses Problem verursacht werden
quelle
Ich habe dieses Problem. Und ich fand heraus, dass es meine Frage war. Dies bedeutet, wenn ich mit Zuordnung abfrage, ohne eine Tabellenspalte anzugeben. Ex:
class Holiday < ApplicationRecord belongs_to :company end class Company < ApplicationRecord has_many :timeoffs end
Im Urlaubsmodell frage ich ab
Der Fehler tritt auf, weil ich nicht angegeben habe, welche Tabelle
id
für mich funktioniert hat, nachdem ich den Code in geändert habequelle