«PGError: ERROR: текущая транзакция прервана» в миграции rails3 - PullRequest
0 голосов
/ 01 сентября 2011

Я под Rails 3.0.9, с Ruby 1.9.2 (p290).Используя Postgresql 9.0.4 и гем 'pg' v0.11.0

Проблема в следующем:

У меня действительно простая миграция, просто меняя значение столбца с условиями:

def self.up
  Closet.reset_column_information
  say_with_time "Unifying gender column to h/f" do
    Closet.connection.update "UPDATE closets AS c SET gender='h' WHERE c.gender IN ('homme', 'Homme', 'men', 'Men');"
    Closet.connection.update "UPDATE closets AS c SET gender='f' WHERE c.gender IN ('femme', 'Femme', 'women', 'Women');"
  end
end

Каждый запрос прекрасно работает в моей консоли erb и в консоли pgAdmin SQL, но когда я запускаю миграцию, он говорит:

PGError: ERROR:  current transaction is aborted, commands ignored until end of transaction block

Если кто-нибудь как идея ...

Вот большая часть стека сообщений об ошибках:

== MigrateClosets: миграция ======================================================== грабли прерваны!Произошла ошибка, эта и все последующие миграции отменены:

PGError: ERROR:  current transaction is aborted, commands ignored until end of transaction block
: UPDATE closets SET gender='h' WHERE closets.gender  = 'homme';
/Users/gdurelle/.rvm/gems/ruby-1.9.2-p290@dressmeNG/gems/activerecord-3.0.9/lib/active_record/connection_adapters/abstract_adapter.rb:207:in `rescue in log'
/Users/gdurelle/.rvm/gems/ruby-1.9.2-p290@dressmeNG/gems/activerecord-3.0.9/lib/active_record/connection_adapters/abstract_adapter.rb:199:in `log'
/Users/gdurelle/.rvm/gems/ruby-1.9.2-p290@dressmeNG/gems/activerecord-3.0.9/lib/active_record/connection_adapters/postgresql_adapter.rb:514:in `execute'
/Users/gdurelle/.rvm/gems/ruby-1.9.2-p290@dressmeNG/gems/activerecord-3.0.9/lib/active_record/connection_adapters/abstract/database_statements.rb:288:in `update_sql'
/Users/gdurelle/.rvm/gems/ruby-1.9.2-p290@dressmeNG/gems/activerecord-3.0.9/lib/active_record/connection_adapters/postgresql_adapter.rb:525:in `update_sql'
/Users/gdurelle/.rvm/gems/ruby-1.9.2-p290@dressmeNG/gems/activerecord-3.0.9/lib/active_record/connection_adapters/abstract/database_statements.rb:49:in `update'
/Users/gdurelle/.rvm/gems/ruby-1.9.2-p290@dressmeNG/gems/activerecord-3.0.9/lib/active_record/connection_adapters/abstract/query_cache.rb:16:in `update'
/Users/gdurelle/Sites/rails/DressMeNextGen/db/migrate/20110613125139_migrate_closets.rb:4:in `up'
/Users/gdurelle/.rvm/gems/ruby-1.9.2-p290@dressmeNG/gems/activerecord-3.0.9/lib/active_record/migration.rb:314:in `block in migrate'
/Users/gdurelle/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/benchmark.rb:295:in `measure'
/Users/gdurelle/.rvm/gems/ruby-1.9.2-p290@dressmeNG/gems/activerecord-3.0.9/lib/active_record/migration.rb:314:in `migrate'

1 Ответ

2 голосов
/ 01 сентября 2011

Вот пара диких догадок, которые могут помочь.Похоже, у вас транзакция прерывается, где-то перехватывается и игнорируется;это может испортить всю транзакцию, в которой выполняется self.up, и объяснить ваше сообщение об ошибке и поведение, которое вы видите.

Вызов reset_column_information обычно идет после изменение базы данных и только в том случае, если схема изменилась, и вам нужно использовать новую схему для остальной части миграции;ни один из них не применим к вам, поэтому вы можете полностью отказаться от Closet.reset_column_information.

У вас также должен быть метод execute, доступный в ваших миграциях, так что вам вообще не нужно разговаривать с Closet.Кроме того, вам не нужны точки с запятой в конце ваших операторов SQL;они, вероятно, не причинят вреда, но если мы разберемся с этим до самого необходимого, мы могли бы устранить проблему.

Попробуйте и посмотрите, что произойдет:

def self.up
  say_with_time "Unifying gender column to h/f" do
    execute %q{UPDATE closets SET gender = 'h' WHERE gender IN ('homme', 'Homme', 'men', 'Men')}
    execute %q{UPDATE closets SET gender = 'f' WHERE gender IN ('femme', 'Femme', 'women', 'Women')}
  end
end

Это дает намнеобходимый минимум для обновления вашей базы данных.Надеюсь, что проблема со случайными транзакциями ушла со всеми остальными вещами, которые вам не нужны.

...