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.
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 .
Ich hatte dieses Problem. Starten Sie einfach den Rails Server neu und es sollte funktionieren
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".
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
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.
In meinem Fall habe ich diesen Fehler erhalten, nur weil ich meine Test-Datenbank nicht rake'd hatte.
Problem:
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.
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.
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
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)