ruby-on-rails RoR:无法在postgres中更改_column,在MySQL中可以(MySQL用于开发,Heroku上的Postgres)

nkoocmlb  于 2023-02-17  发布在  Ruby
关注(0)|答案(2)|浏览(99)

我有个专栏叫"奖品":

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来解决这个问题,但是我不知道我该怎么做,也不知道这是否适合我正在尝试做的事情。
任何能弄清楚这一点的见解都将非常感激。
谢谢林哥

pkwftd7m

pkwftd7m1#

首先,您应该在两个环境中使用相同的DB,以防止出现这种意外情况。
要在迁移中运行原始sql,请参阅此示例http://guides.rubyonrails.org/migrations.html#using-the-up-down-methods

f2uvfpb9

f2uvfpb92#

我想你得用手来做:

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,列截断行为,...)。

相关问题