如何在Heroku中更改列类型?

时间:2010-06-19 15:00:28

标签: ruby-on-rails ruby database postgresql heroku

我正在尝试将数据库迁移到我的heorku实例中,我收到错误。 FAQ描述了我的错误如下:

  

无法更改列类型

     

示例:PGError:ERROR:列   “verified_at”无法转换为类型   “日期”

     

原因:PostgreSQL不知道如何操作   将该表中的所有行强制转换为   指定的类型。最有可能的意思是   你有一个整数或一个字符串   那一栏。

     

解决方案:检查您的记录和   确保他们可以转换为   新型。有时它更容易   只是避免使用change_column,   重命名/创建新列   代替。

如何立即更改此迁移。这是我的问题。对于我的联系人表,我创建了以下内容:

  t.string :date_entered

在稍后的迁移中,我执行以下操作:

 change_column :contacts, :date_entered, :date

此change_column似乎是问题所在。

我应该......手动改变迁移吗?有没有办法可以清理表格中的数据(我不知道Heroku会识别表格中的数据,因为我正在做耙子)。

我显然需要更改此值,并在整个应用程序中使用它。感谢。

这就是我想要的......想法?

def self.up
  #change_column :contacts, :date_entered, :date
  #this fails in postgres, so trying the same outcome 

  rename_column :contacts, :date_entered, :date_entered_old
  add_column :contacts, :date_entered, :date
  remove_column :contacts, :date_entered_old
end

def self.down
  add_column :contacts, :date_entered_old
  remove_column :contacts, :date_entered
  rename_column :contacts, :date_entered_old, :date_entered
end

2 个答案:

答案 0 :(得分:40)

执行以下操作:

  1. 重命名列A
  2. 将新列B创建为日期
  3. 将数据从A移动到B
  4. 删除A
  5. 换句话说

    def self.up
      rename_column :contacts, :date_entered, :date_entered_string
      add_column :contacts, :date_entered, :date
    
      Contact.reset_column_information
      Contact.find_each { |c| c.update_attribute(:date_entered, c.date_entered_string) } 
      remove_column :contacts, :date_entered_string
    end
    

答案 1 :(得分:1)

这是Simone Carletti解决方案的经过修改和测试的版本

class ModifyContacts < ActiveRecord::Migration
  def self.up
    rename_column :contacts, :date_entered, :date_entered_string
    add_column :contacts, :date_entered, :date

    Contact.reset_column_information
    Contact.find(:all).each { |contact| contact.update_attribute(:date_entered, contact.date_entered_string) }
    remove_column :contacts, :date_entered_string
  end
end