Rails:更改列类型,但保留数据

时间:2012-03-02 10:58:09

标签: ruby-on-rails model

我有一个类型为integer的列的模型,我希望将其转换为string类型。现在我正在寻找更改列类型而不丢失数据的最佳方法。是否有一种无痛的方法来实现这一目标?

6 个答案:

答案 0 :(得分:36)

使用change_column方法的标准迁移会将整数转换为字符串而不会丢失任何数据。 rake db:rollback也会在没有错误的情况下进行反向迁移。

以下是我用来确认此行为的测试迁移:

class ChangeAgeToString < ActiveRecord::Migration
  def self.up
    change_column :users, :age, :string
  end

  def self.down
    change_column :users, :age, :integer
  end
end

答案 1 :(得分:4)

对于postgres 在迁移中

 change_column :table_name, :field,'boolean USING (CASE field WHEN \'your any string as true\' THEN \'t\'::boolean ELSE \'f\'::boolean END)'

和任何类似的有效类型

答案 2 :(得分:2)

如果它是一次性的,你只需更改数据库中的列类型(因为没有信息从int转移到varchar)

对于MySQL,这样做:

ALTER TABLE t1 MODIFY col1 VARCHAR(256)

如果您使用的是SQLite,则无需执行任何操作。

答案 3 :(得分:2)

对于 postgresql ,将表格列数据类型integer更改为string
rails migration like this with up and down actions

class ChangeAgeToString < ActiveRecord::Migration
  def self.up  
    change_column :users, :age, 'varchar USING CAST(age AS varchar)', null: false
  end

  def self.down
    change_column :users, :age, 'integer USING CAST(age AS integer)', null: false, default: 0
  end
end

答案 4 :(得分:1)

如果使用Postgres,则不能隐式地将字符串强制转换为整数,因此使更改可逆的方法是:

class ChangeAgeToString < ActiveRecord::Migration
  def self.up
    change_column :users, :age, :string
  end

  def self.down
    add_column :age_integer
    User.connection.execute('UPDATE users SET age_integer = cast(age as int)')
    remove_column :users, :age
    rename_column :users, :age_integer, :age
  end
end

答案 5 :(得分:1)

您可以尝试这样的事情:

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

甚至更好:

change_column :table_name, :column_name, :integer, using: 'column_name::integer'

您可以在此处详细了解此主题:https://kolosek.com/rails-change-database-column