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