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可用的方法,因此根本不需要与 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

这为我们提供了更新数据库所需的最低限度。希望杂散交易问题随着您不需要的所有其他东西而消失。

于 2011-09-01T09:27:02.960 回答