Rails迁移将字符串转换为整数?

dan*_*mcc 27 database migration string integer ruby-on-rails

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

有问题的表的当前db结构是:

create_table :people do |t|
t.string :company_id
Run Code Online (Sandbox Code Playgroud)

这可能是使用迁移吗?

我想也许在迁移中删除旧字段,创建一个整数的新字段 - 但我担心这将清除已经输入的所有数据.

谢谢,

丹尼

use*_*754 46

不要掉落列,使用它

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'
Run Code Online (Sandbox Code Playgroud)

你从PostgreSQL获得的"提示"基本上告诉你,你需要确认你是否希望这种情况发生,以及如何转换数据.要确认更改,请在迁移中使用上面的块


Joã*_*uza 35

其他答案是正确的,但您可以使用:using关键字更进一步:

change_column :people, :company_id, :integer, using: 'company_id::integer'
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最好的正确答案 (2认同)

小智 34

不要删除列,它将清除数据.

不过你可以试试

change_column :people, :company_id, :integer
Run Code Online (Sandbox Code Playgroud)

如果所有的值company_id都可以转换成integer,那就应该没问题了.

如果不是这种情况(即默认情况下不能转换所有字符串),那么您可以分两步完成:1)创建一个新列,然后company_id在一些转换后加载到那里.2)删除company_id,然后重命名新列.

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

  • 在PG中,你可以这样做`change_column:table_name,:column_name,'integer USING CAST(column_name AS integer)'`.资料来源:http://makandracards.com/makandra/18691-postgresql-vs-rails-migration-how-to-change-columns-from-string-to-integer (22认同)
  • 当我将代码推送到Heroku时,第一种方法为我生成了错误.PG :: DatatypeMismatch:错误:列"company_id"无法自动转换为类型integer HINT:指定USING表达式以执行转换.:ALTER TABLE"协作者"ALTER COLUMN"company_id"TYPE整数rake中止!StandardError:发生错误,此以及所有后续迁移都已取消:PG :: DatatypeMismatch:错误:列"company_id"无法自动转换为类型integer HINT:指定USING表达式以执行转换. (3认同)