为了Heroku,从MySQL切换到PostgreSQL用于Ruby on Rails

Rin*_*cke 7 mysql postgresql ruby-on-rails heroku ruby-on-rails-3

我正在尝试将一个全新的Ruby on Rails应用程序推送到Heroku.目前,它位于MySQL上.看起来Heroku并不真正支持MySQL,因此我们正在考虑使用他们支持的PostgreSQL.

我有多难以期待这一点?我需要做些什么来实现这一目标?

再次请注意,我现在的DB(开发和生产)都是空的.

mu *_*ort 9

常见问题:

  1. GROUP BY行为.PostgreSQL有一个相当严格的GROUP BY.如果使用GROUP BY子句,则SELECT中的每个列都必须出现在GROUP BY中或用于聚合函数.
  2. 数据截断.char(n)除非你的服务器处于严格模式,否则MySQL会悄悄地截断一个长字符串以适应列,PostgreSQL会抱怨并让你自己截断你的字符串.
  3. 引用不同,MySQL使用反引号来引用标识符,而PostgreSQL使用双引号.
  4. LIKE在MySQL中不区分大小写,但在PostgreSQL中不区分大小写.这导致许多MySQL用户使用LIKE作为不区分大小写的字符串相等运算符.

(1)如果您group在任何查询中使用AR的方法或在任何原始SQL中使用GROUP BY 将是一个问题.做一些搜索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 blower(a) like lower(b)(或者upper(a) like upper(b)如果您想要喊出)来修复此问题,或者a ilike b注意PostgreSQL的ILIKE是非标准的.

还有其他差异会导致麻烦,但这些差异似乎是最常见的问题.

你必须审查一些安全的事情:

  • group 调用.
  • 原始SQL(包括where调用中的任何代码段).
  • 模型中的字符串长度验证.
  • LIKE的所有用途.


Dyl*_*kow 5

如果您没有要迁移的数据,它应该简单地告诉您Gemfile使用pggem代替,运行bundle install,然后更新database.yml文件以指向PostgreSQL数据库。然后,只需运行您的迁移(rake db:migrate),一切就可以正常进行。


Joh*_*non 4

不要觉得你必须迁移到 Postgres - Heroku 上有几个可用的 MySQL 插件提供程序 - http://addons.heroku.com/cleardb是我最成功的一个。