ActiveRecord:: StatementInvalid: PG InFailedSqlTransaction

Próbuję utworzyć obiekt ActiveRecord.Ale dostaję ten błąd podczas tworzenia go.

(0.1ms)  ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR:  current transaction is       aborted, commands ignored until end of transaction block
Wszelkie pomysły na ten temat.
Author: untwal, 2014-01-15

10 answers

Żadna z pozostałych odpowiedzi nie naprawia przyczyna źródłowa o problemie.

Problem polega na tym, że gdy Postgres zgłasza wyjątek, zatruwa przyszłe transakcje na tym samym połączeniu.

Poprawka polega na wycofaniu transakcji:

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

  raise e
end

Zobacz odniesienie .

 81
Author: B Seven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-31 19:47:22

Miałem taki problem. Wystarczy zrestartować serwer Rails i powinno działać

 77
Author: Furkan Ayhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-19 12:53:58

Ten problem występował w moim środowisku testowym i był spowodowany faktem, że każdy test był zawinięty w własną transakcję.

Używałem Gem database_cleaner i skonfigurowałem go tak, aby nie zawijać testów w transakcję, jeśli używają javascript. Aby rozwiązać ten problem, dodałem js: true do każdej specyfikacji, która powodowała ten problem. (Nawet myślałem, że specyfikacje nie używają javascript, był to najwygodniejszy sposób, aby upewnić się, że testy nie będą zawinięte w transakcja. Jestem pewien, że jest na to mniej hakerskich sposobów).

Dla odniesienia, oto konfiguracja database_cleaner z 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

Jeśli nie używasz database_cleaner, to prawdopodobnie powodem, dla którego testy byłyby zawinięte w transakcje, byłoby to, że opcja use_transactional_fixtures jest ustawiona na true w spec/spec_helper.rb. Spróbuj ustawić wartość false.

 14
Author: Teddy Widom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 15:23:50

Możesz zobaczyć, co naprawdę się dzieje w dzienniku postgresql, spędzam dużo czasu, aby zagłębić się w ten problem, i w końcu dowiedzieć się, że niewłaściwie upsert gem powoduje błąd PG, tylko w dzienniku postgresql mają prawdziwe informacje o tym, co się dzieje

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

 7
Author: William Herry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-25 02:02:58

Napotkałem ten błąd, gdy odwołuję się do kolumny w moich specyfikacjach, która już nie istnieje. Upewnij się, że baza danych jest aktualna, a kod nie oczekuje kolumny, która nie istnieje.

 3
Author: lobati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-13 18:06:47

W moim przypadku otrzymałem ten błąd po prostu dlatego, że nie grabiłem mojego testowego db.

 2
Author: nfriend21,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 12:44:07

W moim przypadku konfiguracja Postgres w /usr/local/var/postgres/postgresql.conf miała datetype jako międzynarodowy format dmy

Zmiana datetype na Amerykański format mdy naprawiła ten problem.

 2
Author: Winsor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 22:25:50

Problem:

  1. program wykonuje niepoprawne polecenie SQL. Błędna instrukcja SQL jest główną przyczyną problemu.
  2. program nie wycofuje ani nie zwalnia SAVEPOINT natychmiast po niepoprawnym poleceniu SQL.
  3. program wykonuje polecenia SQL po niepoprawnym poleceniu SQL.
  4. PostgreSQL wyświetla błąd: bieżąca transakcja jest przerwana, polecenia ignorowane do końca bloku transakcji

Rozwiązanie:

Znajdź niepoprawne polecenie SQL i popraw to. Jeśli nie chcesz poprawiać instrukcji SQL, użyj ROLLBACK lub zwolnij SAVEPOINT po nieprawidłowym poleceniu SQL.

 1
Author: John Doe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-24 21:50:25

Miałem podobny problem po aktualizacji Rails z 4.2.2 do 4.2.5 musiałem upgrade pg gem i problem zaczął się dziać

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 odpowiedź jest w tym sensie słuszna, podsumowując problem:

Czasami, gdy używasz DatabaseCleaner.clean_with :deletion, możesz zakłócać transakcję PostgreSQL.

Więc rozwiązaniem dla mnie było zastąpienie DatabaseCleaner.clean_with :deletion w częściach testów, gdzie było to spowodowane DatabaseCleaner.clean_with :truncation

Jeszcze jedna rzecz do googlowania ludzi. Jeśli zauważysz to stack trace:
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...
^

...może to być spowodowane przez ten problem

 0
Author: equivalent8,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:45

Mam taki problem. I dowiedziałam się, że to było moje zapytanie. To znaczy, gdy zapytuję z asocjacją bez określania kolumny tabeli. ex:

class Holiday < ApplicationRecord
     belongs_to :company
end

class Company < ApplicationRecord
    has_many :timeoffs
end

In Holiday model i query

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

Błąd występuje, ponieważ nie określiłem, która Tabela id Zadziałało u mnie po zmianie kodu na

company.timeoffs.where("(start_date <= ? and end_date >= ?) and time_offs.id != ?", begin_date, begin_date, 1)
 0
Author: pdkpro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-20 03:12:05