RoR:不能在postgres中更改_column,在MySQL中可以很好(MySQL用于开发,Postgres在Heroku上)

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

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来解决这个问题。 但我不知道如何做到这一点,以及这是否适合我正在尝试做的事情。

任何深入了解这一点的人都会非常感激。

谢谢! 林戈

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

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

我想你必须手工完成:

 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,列截断行为……)你会遇到的。