2010-08-21 39 views
23

是否可以将字符串字段更改为整数而不清除已输入的数据?Rails将字符串转换为整数的迁移?

目前DB结构问题的表是:

create_table :people do |t| 
t.string :company_id 

这可能使用迁移?

我在想,也许在迁移下降旧领域,创建一个新的整数 - 但我担心这将清除所有已输入的数据。

感谢,

丹尼

回答

28

不要删除列,它会清除数据。

但是,您可以尝试

change_column :people, :company_id, :integer 

而如果company_id所有的值可以转换为integer,应该没事。

如果情况并非如此(即并非所有字符串都可以默认转换),那么您可以分两步进行:1)创建一个新列,然后在某个转换后加载company_id。 2)放下company_id然后重命名新列。

你应该小心这两种方法(对于第二种方法更是如此),如果可以的话,你应该首先在数据库副本上执行。

+0

感谢提高格式化,jigfox – Zaki 2010-08-21 09:43:14

+0

大,谢谢。我想我不必在第一个例子中说明当前类型? – dannymcc 2010-08-21 09:44:59

+2

当我将代码推送到Heroku时,第一种方法为我生成错误。 PG :: DatatypeMismatch:ERROR:列“company_id”不能自动转换为键入整数 提示:指定一个USING表达式来执行转换。 :ALTER TABLE“协作者”ALTER COLUMN“company_id”类型整数 rake中止! StandardError:发生错误,此次及以后的所有迁移取消: PG :: DatatypeMismatch:ERROR:列“company_id”不能自动转换为键入整数 提示:指定一个USING表达式来执行转换。 – Evolve 2014-04-15 07:43:25

31

不要删除列,使用此

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

的“暗示”你的PostgreSQL得到基本上告诉你,你需要确认你要做到这一点,以及数据应该如何转换。要确认更改,在迁移

+0

这应该是公认的答案 – BananaNeil 2018-02-13 23:21:40

8

其他的答案是正确的使用上面的块,但你可以采取一步与:using关键字:

change_column :people, :company_id, :integer, using: 'company_id::integer'