Ruby on rails &引用;PGError:错误:当前事务被中止;在rails3迁移中
我使用的是Rails 3.0.9和Ruby 1.9.2(p290)。 使用Postgresql 9.0.4和“pg”gem v0.11.0 问题是: 我有一个非常简单的迁移,只需根据以下条件更改列的值:Ruby on rails &引用;PGError:错误:当前事务被中止;在rails3迁移中,ruby-on-rails,postgresql,transactions,migration,rails-migrations,Ruby On Rails,Postgresql,Transactions,Migration,Rails Migrations,我使用的是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 S
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'
下面是一些可能有用的疯狂猜测。看起来您的某个事务正在中止、被捕获并被忽略;这可能会打乱self.up运行的整个事务,这将解释您的错误消息和您看到的行为 调用通常在数据库更改之后进行,并且仅当模式已更改并且您需要在迁移的其余部分使用新模式时才进行;这两项都不适用于您,因此您可以完全删除
壁橱。重置列信息
在您的迁移中还应该有一个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
这为我们提供了更新数据库所需的最低限度。希望杂散事务问题与所有其他您不需要的东西一起消失。在此之前会有一个错误导致事务中止。你需要找到那个。