2012-06-30 14 views
1

我曾呼籲「獎」一欄:回報率:在Postgres不能只是change_column,罰款在MySQL(MySQL的發展,Postgres的在Heroku)

create_table :contests do |t| 
    t.text :prize 

最近我意識到,這將永遠是一個整數,我要設置默認值:

def change 
    change_column :contests, :prize, :integer, :default => 200 

這工作得很好我的本地機器,在那裏我使用的MySQL數據庫上。然而,當我推到我的生產現場(這是在Heroku上託管,這給了我一個Postgres DB)我得到以下錯誤:

PGError: ERROR: column "prize" cannot be cast to type "pg_catalog.int4" 
: ALTER TABLE "contests" ALTER COLUMN "prize" TYPE integer 

本文內容:http://www.postgresonline.com/periodical.php?i_id=3他們討論使用的使用來解決這個問題。但我不知道我該怎麼做,以及這是否適合我所要做的事。

任何深入瞭解搞清楚了這一點將會非常讚賞。

謝謝! 林戈

+0

如果獎品列中的所有值都轉換爲整數您的代碼應該只有工作,還[這個答案](http://stackoverflow.com/questions/3537064/rails-migration-to-convert-string-to-見整數) – gshilin

+1

是否有什麼理由不使用相同的數據庫進行開發? – sdolan

回答

1

我認爲你必須通過做手工:

def up 
    connection.execute(%q{ 
     alter table contests 
     alter column prize type integer using cast(prize as integer), 
     alter column price set default 200 
    }) 
end 

如果你想運行在MySQL和PostgreSQL的相同的遷移然後:

def up 
    case ActiveRecord::Base.connection 
    when ActiveRecord::ConnectionAdapters::PostgreSQLAdapter 
     connection.execute(%q{ 
      alter table contests 
      alter column prize type integer using cast(prize as integer), 
      alter column price set default 200 
     }) 
    when ActiveRecord::ConnectionAdapters::MySQLAdapter 
     # MySQL version... 
    end 
end 

一旦你解決這個問題搞定了,你的下一個任務將是你的開發環境到PostgreSQL的切換,這樣你就可以開始FIXI除其他所有小問題(例如GROUP BY問題,區分大小寫的LIKE,列截斷行爲...)。

+0

我得到這個錯誤:Mysql2 ::錯誤:您的SQL語法中有錯誤;檢查與您的MySQL服務器版本相對應的手冊,在正確的語法附近使用類型整型使用cast(整數獎) –

+0

@RingoBlancke:您必須在遷移過程中爲不同的數據庫使用不同的東西。檢查我的更新。 –