如何在Heroku中更改列类型?

Tim*_* T. 21 ruby database postgresql ruby-on-rails heroku

我试图将db:migrations迁移到我的heorku实例中,但是我收到错误.FAQ描述了我的错误如下:

无法更改列类型

示例:PGError:错误:列"verified_at"无法强制转换为"日期"类型

原因:PostgreSQL不知道如何将该表中的所有行强制转换为指定的类型.很可能这意味着您在该列中有一个整数或一个字符串.

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

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

  t.string :date_entered
Run Code Online (Sandbox Code Playgroud)

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

 change_column :contacts, :date_entered, :date
Run Code Online (Sandbox Code Playgroud)

这个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
Run Code Online (Sandbox Code Playgroud)

Sim*_*tti 41

请执行下列操作:

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

换一种说法

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
Run Code Online (Sandbox Code Playgroud)

  • 如果您有大量数据,update_attribute循环可能需要很长时间.运行这个原始的sql语句可以更快地完成所有操作.`ActiveRecord :: Base.connection.execute("update table set new_column = old_column");`如果旧值需要强制转换也没问题,请在更新调用中使用postgres强制转换. (3认同)