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

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

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

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

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

常见问题:

  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)如果您在任何查询中使用AR的group方法或在任何原始SQL中使用GROUP BY将是一个问题。 有些搜索column "X" must appear in the GROUP BY clause or be used in an aggregate function ,您将看到一些示例和常见解决方案。

(2)如果在应用程序的任何位置使用字符串列并且模型未正确validation所有传入字符串值的长度,则会出现问题。 请注意,在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的ILIKE是非标准。

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

你必须回顾一些让我们感到安全的事情:

  • group电话。
  • 原始SQL(包括调用的任何片段)。
  • 模型中的字符串长度validation。
  • LIKE的所有用途。

如果您没有要迁移的数据,那么它应该像告诉您的Gemfile使用pg gem,运行bundle install ,以及更新database.yml文件以指向PostgreSQL数据库一样简单。 然后运行您的迁移( rake db:migrate ),一切都应该运行良好。

它本身应该是简单的:将DDL从MySQL移植到PostgreSQL。

Heroku是否有任何模式创建脚本? 如果他们有空,我会依赖他们。

MySQL和PostgreSQL是不同的(例如MySQL的身份类型,PostgreSQL的序列)。 但港口不应该太难。 多少桌子? 十分可行。