0

私は Rails 3.0.9 と Ruby 1.9.2 (p290) を使用しています。Postgresql 9.0.4 と 'pg' gem 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'
4

1 に答える 1

2

ここに役立つかもしれないいくつかのワイルドな推測があります. トランザクションが中止され、キャッチされ、どこかで無視されているようです。実行中のトランザクション全体を台無しにする可能性がself.upあり、エラーメッセージと表示されている動作を説明できます.

このreset_column_information呼び出しは通常、データベースの変更に行われ、スキーマが変更され、残りの移行で新しいスキーマを使用する必要がある場合にのみ行われます。どちらにも当てはまらないので、Closet.reset_column_information完全にドロップできます。

またexecute、クローゼットと話す必要がまったくないように、移行で利用可能なメソッドが必要です。また、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

これにより、データベースを更新するために必要な最低限の情報が得られます。うまくいけば、不要なトランザクションの問題がすべてなくなりました。

于 2011-09-01T09:27:02.960 に答える