我試圖將一個全新的Ruby on Rails應用程序推送到Heroku。目前,它位於MySQL上。看起來Heroku並不真的支持MySQL,所以我們正在考慮使用他們支持的PostgreSQL。爲了Heroku的目的,從MySQL切換到PostgreSQL for Ruby on Rails
我應該有多難?我需要做些什麼才能做到這一點?
請再次注意,我現在的DB(開發&生產)都是完全空的。
我試圖將一個全新的Ruby on Rails應用程序推送到Heroku。目前,它位於MySQL上。看起來Heroku並不真的支持MySQL,所以我們正在考慮使用他們支持的PostgreSQL。爲了Heroku的目的,從MySQL切換到PostgreSQL for Ruby on Rails
我應該有多難?我需要做些什麼才能做到這一點?
請再次注意,我現在的DB(開發&生產)都是完全空的。
不要覺得你必須遷移到Postgres--在Heroku上有幾個MySQL插件提供商 - http://addons.heroku.com/cleardb是我最成功的一個。
它應該是簡單性:將DDL從MySQL移植到PostgreSQL。
Heroku是否有任何模式創建腳本?如果他們可用,我會依賴那些人。
MySQL和PostgreSQL不同(例如MySQL的身份類型,PostgreSQL的序列)。但港口不應該太難。多少桌子?十個是可行的。
如果你沒有數據遷移,它應該是爲講述你Gemfile
使用pg
寶石代替,運行bundle install
,並更新你的database.yml
文件指向你的PostgreSQL數據庫一樣簡單。然後只需運行你的遷移(rake db:migrate
),一切都應該很好。
常見問題:
char(n)
列,PostgreSQL會發出抱怨並讓你自己截斷字符串。(1)將是一個問題,如果您在任何查詢或GROUP BY中使用AR的group
方法在任何原始SQL中。做一些搜索column "X" must appear in the GROUP BY clause or be used in an aggregate function
,你會看到一些例子和常見的解決方案。
(2)將是一個問題,如果您在您的應用程序的任何位置使用字符串列,並且您的模型未正確驗證傳入字符串值的長度全部。請注意,在Rails中創建字符串列而不指定限制實際上會創建一個varchar(255)
列,因此實際上存在隱含的:limit => 255
,即使您沒有指定。另一種方法是使用t.text
代替t.string
;這會讓你使用任意大的字符串而不會受到懲罰(至少對於PostgreSQL來說)。正如Erwin在下面指出的那樣(以及其他所有機會),varchar(n)
在PostgreSQL世界中有點不合時宜。
(3)不應該是一個問題,除非你的代碼中有原始的SQL。
(4)如果您在應用程序的任何位置使用LIKE,將會成爲問題。您可以通過將a like b
更改爲lower(a) like lower(b)
(或upper(a) like upper(b)
如果您想喊)或a ilike b
來修復此問題,但請注意PostgreSQL's ILIKE是非標準問題。
還有其他的差異可能會導致麻煩,但這些似乎是最常見的問題。
你必須回顧一些事情感到安全:
group
電話。where
調用中的任何片段)。廣告1. GROUP BY:對於版本8.3(Heroku)是正確的,但在版本9.1中已更改。 [發佈說明告訴我們](http://www.postgresql.org/docs/9.1/interactive/release-9-1.html):'當指定主鍵時,允許查詢目標列表中的非GROUP BY列在GROUP BY子句中('Eisentraut')' – 2012-01-05 05:33:18
Ad 2.通過在PostgreSQL中使用優秀的字符串數據類型'text'(或'varchar'沒有長度說明符)可以避免所有的麻煩。 **如果**有'varchar(n)'列,則可以通過明確地轉換:''foobarbaz':: varchar(3)''來避免錯誤。我引用[manual](http://www.postgresql.org/docs/9.1/interactive/datatype-character.html):'超長將被截斷爲n個字符而不會引發錯誤。' – 2012-01-05 05:40:25
@Erwin: Heroku使用8.3共享,9.0使用專用,所以GROUP BY問題仍然適用,直到Heroku升級(我一直希望9.1升級只是爲了讓Peter的GROUP BY改變)。當你使用Rails的時候,你會遇到varchar問題,除非你的列使用了'text'而不是'string'(這些是Rails類型,而不是PostgreSQL類型),你也不能將其轉換爲SQL,除非你手工編寫,這在Rails代碼中不會發生。 – 2012-01-05 05:49:53
酷我可能不得不繼續嘗試這一點,謝謝你的信息! – 2012-01-08 23:14:00
應該指出的是,MySQL插件有一些限制,使得它對於嚴重的應用程序來說不實用。 – Dan 2015-01-19 18:54:14