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. 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 .
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ć
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.
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
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.
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.
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.
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:
- program wykonuje niepoprawne polecenie SQL. Błędna instrukcja SQL jest główną przyczyną problemu.
- program nie wycofuje ani nie zwalnia SAVEPOINT natychmiast po niepoprawnym poleceniu SQL.
- program wykonuje polecenia SQL po niepoprawnym poleceniu SQL.
- 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.
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
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
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)
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