【问题标题】:Rails Migration to convert string to integer using conversionRails Migration 使用转换将字符串转换为整数
【发布时间】:2014-03-14 01:06:46
【问题描述】:

有一个很好的问题here我想详细说明一下。我正在尝试将数据库中的列从字符串转换为整数。

我认为转换会非常直接。目前我的字符串是

["10", "12", "125", "135", "140", ...]

我的迁移文件包括:

def change
    change_column :table_name, :product_code, :integer
end

Rails 尝试这样做,但 Postgresql 抛出错误。

PG::Error: 错误:列“product_code”无法自动转换为整数类型
提示:指定一个 USING 表达式来执行转换。

我不确定如何在我的 Rails 迁移中使用这个“USING”表达式。

所以我认为转换会非常简单。我应该使用什么作为 USING 表达式?

【问题讨论】:

  • 感谢您提出这个问题。坚持下去
  • 我一直在读一本关于 SQL 的书,现在正在摇头。当然,你不能只将字符串转换为整数而不使用一些 SQL 语句来说明你想如何 CAST 它。希望我很久以前就了解 SQL。

标签: postgresql ruby-on-rails-4 rails-migrations


【解决方案1】:
change_column :table_name, :product_code,
  'integer USING CAST(product_code AS integer)'

来源: http://makandracards.com/makandra/18691-postgresql-vs-rails-migration-how-to-change-columns-from-string-to-integer

【讨论】:

  • 似乎不适用于空白字符串。 invalid input syntax for integer: ""
  • 嗯,这是有道理的。什么整数代表一个空白字符串?
  • 这会重置索引吗?执行此类迁移后,我收到了错误排序的查询。
  • 如果你关心排序,你应该指定一个明确的 ORDER BY
【解决方案2】:

调整代码以支持转换空白字符串:

change_column :table_name, :product_code, 
  "integer USING NULLIF(product_code, '')::int"

空字符串变成NULL,在类型转换时变成0,这可能是在这种情况下你能做的最好的事情。

【讨论】:

  • 像魅力一样工作。我遇到了同样的问题 - 从 stackoverflow.com/a/22394425/1513205 迁移在空数据库上效果很好 - 但我们的数据库中已经有空字符串值。
【解决方案3】:

当您编写 Rails 迁移以将字符串列转换为整数时,您通常会这样写:

change_column :table_name, :column_name, :integer

你可能会得到这个:

PG::DatatypeMismatch: ERROR:  column "column_name" cannot be cast automatically to type integer
HINT:  Specify a USING expression to perform the conversion.

“提示”基本上告诉您需要确认您希望发生这种情况,以及如何转换数据。只需在迁移中这样说:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2012-02-21
    • 2010-12-31
    相关资源
    最近更新 更多