1

我有一个名为“奖品”的专栏:

create_table :contests do |t|
  t.text :prize

我最近意识到这将始终是一个整数,我想设置一个默认值:

def change
  change_column :contests, :prize, :integer, :default => 200

这在我使用 MySQL DB 的本地机器上运行良好。但是,当我推送到我的生产站点(托管在 Heroku 上,它为我提供了 Postgres DB)时,我收到以下错误:

PGError: ERROR:  column "prize" cannot be cast to type "pg_catalog.int4"
: ALTER TABLE "contests" ALTER COLUMN "prize" TYPE integer

在这篇文章中:http ://www.postgresonline.com/periodical.php?i_id=3他们讨论了使用 USING 来解决这个问题。但我不知道我该怎么做,以及这是否适合我正在尝试做的事情。

任何解决这个问题的见解都将非常感激。

谢谢!林戈

4

2 回答 2

2

首先,您应该在两种环境中使用相同的数据库来防止这种意外。

要在迁移中运行原始 sql,请参阅此示例http://guides.rubyonrails.org/migrations.html#using-the-up-down-methods

于 2012-06-30T19:21:01.643 回答
1

我认为您必须手动完成:

def up
    connection.execute(%q{
        alter table contests
        alter column prize type integer using cast(prize as integer),
        alter column price set default 200
    })
end

如果您想在 MySQL 和 PostgreSQL 中运行相同的迁移,那么:

def up
    case ActiveRecord::Base.connection
    when ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
        connection.execute(%q{
            alter table contests
            alter column prize type integer using cast(prize as integer),
            alter column price set default 200
        })
    when ActiveRecord::ConnectionAdapters::MySQLAdapter
        # MySQL version...
    end
end

一旦你解决了这个问题,你的下一个任务就是将你的开发环境切换到 PostgreSQL,这样你就可以开始修复所有其他的小问题(例如 GROUP BY 问题、区分大小写的 LIKE、列截断行为……)你会遇到的。

于 2012-06-30T19:24:01.703 回答