我有一个名为“奖品”的专栏:
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来解决这个问题。但我不知道我该怎么做,以及这是否适合我正在尝试做的事情。
非常感谢任何了解这一点的见解。
谢谢! 林檎
答案 0 :(得分:2)
首先,您应该在两种环境中使用相同的数据库来防止这种意外。
要在迁移中运行原始sql,请参阅此示例http://guides.rubyonrails.org/migrations.html#using-the-up-down-methods
答案 1 :(得分: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,列截断行为,。 ..)你会遇到。