2011-05-06 52 views
0

我正嘗試更新遷移中設置的新列的某些默認值。但是,每當我嘗試對用戶表的記錄執行任何操作時(除了修改其結構),我都會收到Postgres錯誤。我使用Rails 3.0.7,1.9.2紅寶石和PG寶石版本0.11.0與Postgresql運行鍼對用戶表的遷移問題

這裏是遷移:

def self.up 
add_column :users, :state_machine, :string 
add_column :users, :wizard_steps_completed, :integer, :default => "1" 
add_column :users, :activated_at, :datetime 

User.reset_column_information 
User.all.each do |u| 
    u.update_attributes(:state_machine => "activated", :wizard_steps_completed => 3, :activated_at => u.created_at) 
end 
end 

的列添加,沒有任何問題。然而,改變現有的記錄全部失敗,出現以下錯誤:

** Invoke db:migrate (first_time) 
** Invoke environment (first_time) 
** Execute environment 
** Execute db:migrate 
== AddUserSignupInfo: migrating ============================================== 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

PGError: ERROR: current transaction is aborted, commands ignored until end of transaction block 
:    SELECT COUNT(*) 
      FROM pg_tables 
      WHERE tablename = 'users' 

如果我嘗試更新任何orecord它似乎工作,我只能做結構上的改變......

任何想法?

+0

你的User類是否對你的新屬性做了一些有趣的事情? – 2011-05-06 01:02:14

+0

不,只是香草。 爲了簡化起見,我將更新移到了他們自己的遷移中,並更新爲使用update_all只是爲了使其理論上成爲一個事務。 它在控制檯中工作。 – 2011-05-06 01:13:18

+0

我猜想某個地方會觸發數據庫中的錯誤,然後捕獲並更正它(例如,INSERT,違反唯一約束,捕獲異常,改爲執行UPDATE),但是會破壞'db:migrate'事務。如果分兩步進行操作,那麼我會繼續努力,繼續進行更有趣的事情。 – 2011-05-06 02:42:08

回答

1

打開postgres日誌記錄(在/var/lib/pgsql/data/postgresql.conf中配置,並在「錯誤報告和日誌記錄」中配置grep)。或者您可能想要自行運行SQL並查看發生了什麼錯誤。這可能是因爲更新而失敗的一個限制。