2012-01-05 71 views
7

我試圖將一個全新的Ruby on Rails應用程序推送到Heroku。目前,它位於MySQL上。看起來Heroku並不真的支持MySQL,所以我們正在考慮使用他們支持的PostgreSQL。爲了Heroku的目的,從MySQL切換到PostgreSQL for Ruby on Rails

我應該有多難?我需要做些什麼才能做到這一點?

請再次注意,我現在的DB(開發&生產)都是完全空的。

回答

4

不要覺得你必須遷移到Postgres--在Heroku上有幾個MySQL插件提供商 - http://addons.heroku.com/cleardb是我最成功的一個。

+0

酷我可能不得不繼續嘗試這一點,謝謝你的信息! – 2012-01-08 23:14:00

+0

應該指出的是,MySQL插件有一些限制,使得它對於嚴重的應用程序來說不實用。 – Dan 2015-01-19 18:54:14

0

它應該是簡單性:將DDL從MySQL移植到PostgreSQL。

Heroku是否有任何模式創建腳本?如果他們可用,我會依賴那些人。

MySQL和PostgreSQL不同(例如MySQL的身份類型,PostgreSQL的序列)。但港口不應該太難。多少桌子?十個是可行的。

4

如果你沒有數據遷移,它應該是爲講述你Gemfile使用pg寶石代替,運行bundle install,並更新你的database.yml文件指向你的PostgreSQL數據庫一樣簡單。然後只需運行你的遷移(rake db:migrate),一切都應該很好。

9

常見問題:

  1. GROUP BY的行爲。 PostgreSQL有一個相當嚴格的GROUP BY。如果您使用GROUP BY子句,那麼SELECT中的每一列必須出現在您的GROUP BY中或用於聚合函數中。
  2. 數據截斷。除非你的服務器處於嚴格模式,否則MySQL會靜靜地截斷一個長字符串以適應char(n)列,PostgreSQL會發出抱怨並讓你自己截斷字符串。
  3. 引用不同,MySQL使用反引號來引用標識符,而PostgreSQL使用雙引號。
  4. LIKE在MySQL中不區分大小寫,但不在PostgreSQL中。這導致許多MySQL用戶使用LIKE作爲不區分大小寫的字符串相等運算符。

(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電話。
  • 原始SQL(包括where調用中的任何片段)。
  • 模型中的字符串長度驗證。
  • LIKE的所有用途。
+1

廣告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

+1

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

+0

@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