【问题标题】:switching from MySQL to PostgreSQL for Ruby on Rails for the sake of Heroku为了 Heroku 从 MySQL 切换到 PostgreSQL for Ruby on Rails
【发布时间】:2012-02-02 21:30:17
【问题描述】:

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

我应该期望这有多困难?我需要做些什么才能做到这一点?

再次请注意,我的数据库目前(开发和生产)完全是空的。

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-3 postgresql heroku


    【解决方案1】:

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

    Heroku 是否有任何架构创建脚本?如果它们可用,我会依赖它们。

    MySQL 和 PostgreSQL 是不同的(例如 MySQL 的身份类型,PostgreSQL 的序列)。但是端口不应该太难。几张桌子?十个是可行的。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        常见问题:

        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) 如果您在应用程序中的任何位置使用字符串列并且您的模型没有正确验证 all 传入字符串值的长度,这将是一个问题。请注意,在没有指定限制的情况下在 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 调用中的任何 sn-ps)。
        • 模型中的字符串长度验证。
        • LIKE 的所有用法。

        【讨论】:

        • 广告 1. GROUP BY:这适用于版本 8.3 (Heroku),但在版本 9.1 中已更改。 Release notes tell us:Allow non-GROUP BY columns in the query target list when the primary key is specified in the GROUP BY clause (Peter Eisentraut)
        • Ad 2. 使用 PostgreSQL 中的高级字符串数据类型text(或不带长度说明符的varchar)可以避免所有麻烦。 如果您有varchar(n) 列,则可以通过显式转换来避免错误:'foobarbaz'::varchar(3)。我引用manualover-length will be truncated to n characters without raising an error.
        • @Erwin:Heroku 使用 8.3 用于共享,9.0 用于专用,因此 GROUP BY 问题仍然适用,直到 Heroku 开始升级(我一直希望升级 9.1 只是为了让 Peter 的 GROUP BY 更改)。而且你在使用 Rails 时会遇到 varchar 问题,除非你使用 text 而不是 string 作为你的列(这些是 Rails 类型,而不是 PostgreSQL 类型),你也将无法进入SQL 除非您全部手动编写,而且这不会在 Rails 代码中发生。
        • @Erwin:我添加了一些关于字符串与文本的注释,因为这值得一提。
        【解决方案4】:

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

        【讨论】:

        • 很酷,我可能需要继续尝试一下,谢谢您的信息!
        • 应该注意的是,MySQL 插件有一些限制,使其不适用于严肃的应用程序。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多