为了Heroku,从MySQL切换到PostgreSQL用于Ruby on Rails
我正在尝试将一个全新的Ruby on Rails应用程序推送到Heroku。 目前,它位于MySQL上。 看起来Heroku并不真正支持MySQL,因此我们正在考虑使用他们支持的PostgreSQL。
我有多难以期待这一点? 为实现这一目标,我需要做些什么?
再次请注意,我现在的DB(开发和生产)都是空的。
不要觉得你必须迁移到Postgres – Heroku上有几个MySQL Addon提供程序 – http://addons.heroku.com/cleardb是我最成功的一个。
常见问题:
- GROUP BY行为。 PostgreSQL有一个相当严格的GROUP BY。 如果使用GROUP BY子句,则SELECT中的每个列都必须出现在GROUP BY中或用于聚合函数。
- 数据截断。 MySQL会悄悄截断一个长字符串以适应
char(n)
列,除非你的服务器处于严格模式,PostgreSQL会抱怨并让你自己截断你的字符串。 - 引用不同,MySQL使用反引号来引用标识符,而PostgreSQL使用双引号。
- 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的序列)。 但港口不应该太难。 多少桌子? 十分可行。