【问题标题】:Issue with Running Rails Migration in Heroku在 Heroku 中运行 Rails 迁移的问题
【发布时间】:2016-06-24 18:00:24
【问题描述】:

我在开发过程中创建了一个迁移,以将我的客户表中的列类型从整数更改为日期。

迁移:

class UpdateGradToDate < ActiveRecord::Migration
  def change
    change_column :clients, :grad_id, :date
  end
end

这在开发中运行良好。但是,一旦我将它推送到 Heroku,我就会收到以下错误消息。

PG::DatatypeMismatch: ERROR:  column "grad_id" cannot be cast automatically to type date
HINT:  You might need to specify "USING grad_id::date".
: ALTER TABLE "clients" ALTER COLUMN "grad_id" TYPE date

我不确定如何解决这个问题。我在想也许使用 rails 控制台并在那里更改列类型,但我不确定这是否是最好的解决方案。

我也尝试使用这种语法创建一个新的迁移

class ChangeDateFormatInMyTable < ActiveRecord::Migration
  def up
   change_column :clients, :grad_id, :integer
  end

  def down
   change_column :clients, :grad_id, :date
  end
end

我现在不确定该怎么做。

【问题讨论】:

  • grad_id 怎么可能是约会对象?为什么不添加一个有意义的新列作为日期?

标签: ruby-on-rails ruby ruby-on-rails-4 heroku


【解决方案1】:

PostgreSQL 错误清楚地解释了这里的问题:

“grad_id”列无法自动转换为日期类型

您正在尝试将存储整数的字段转换为日期。该字段可以包含任何内容,包括诸如 10、0 或 -200 之类的值。如何将这些值转换为日期?

PostgreSQL 告诉你的是你需要帮助他进行转换。

你最好的方法是:

  1. grad_id 重命名为grad_id_legacy
  2. 创建一个新的grad_id 日期字段
  3. 运行一个脚本,从grad_id_legacy 读取每个值,并将相应的转换后的日期值存储到grad_id

【讨论】:

  • 我建议颠倒您的步骤顺序,即创建grad_id_date,然后将其重命名为grad_id,以最大限度地减少停机时间。也可以使用带有 USING 子句的原始 SQL ALTER TABLE 语句来告诉 Postgres 如何进行转换,但它会在该过程期间锁定表。
猜你喜欢
  • 1970-01-01
  • 2014-02-13
  • 2018-05-30
  • 2012-06-05
  • 2021-10-16
  • 2021-07-13
  • 2016-10-13
  • 2018-10-23
  • 1970-01-01
相关资源
最近更新 更多