【问题标题】:In Rails: How is existing data affected by data type change?在 Rails 中:现有数据如何受数据类型更改的影响?
【发布时间】:2016-03-02 22:33:04
【问题描述】:

我正在开发 Rails 应用程序,并希望更改现有列的数据类型。它目前是 DateTime 类型,我想将其更改为 Date 类型。我找到了一种方法来做到这一点here,但在这种情况下,这个人并不担心预先存在的数据。

现在,我打算生成一个迁移...

rails g migration change_my_column_in_my_talbe

...并进行以下更改:

class ChangeMyColumnInMyTable < ActiveRecord::Migration
  def change
    change_column :my_table, :my_column, :date
  end
end

我的问题是:将现有数据转换为 Date 类型,还是需要创建一个 rake 任务来转换所有现有 DateTime 值的值?

我发现了一个similar question,其中的转换是从布尔值到字符串的,而且对于现有数据来说,这种变化似乎是自动的。我只是想在开始进行此更改之前确定一下。

我使用的是 Rails 4.2.0 版和 MySQL 5.6.27 版 Homebrew。对此问题的任何建议将不胜感激!

【问题讨论】:

    标签: ruby-on-rails database ruby-on-rails-4 type-conversion


    【解决方案1】:

    change_column 将被转换为ALTER TABLE ... ALTER COLUMN SQL 语句,此时如何处理转换取决于您的数据库,因此完整的答案取决于您使用的数据库。但是,您的数据库可以毫无问题地在日期时间和日期之间转换是一个非常安全的选择。

    也就是说,没有比测试更好的方法了!

    【讨论】:

    • 我想出了一种方法来测试它,一切看起来都很好。感谢您的帮助!
    【解决方案2】:

    使用change_column 方法,数据转换将由您正在使用的特定数据库适配器处理。例如,使用mysql 适配器,change_column 将调用ALTER TABLE tbl_name MODIFY COLUMN col_name DATE。从 DATETIME 到 DATE 的数据转换将截断时间。

    此外,MYSQL DATETIME 到 DATE 执行舍入,转换为 DATE 值需要考虑小数秒并舍入时间,'1999-12-31 23:59:59.499' 变为 '1999-12-31',而 ' 1999-12-31 23:59:59.500' 变为 '2000-01-01'。无论哪种方式,change 方法对于 change_column 方法都是不可逆的。

    http://guides.rubyonrails.org/active_record_migrations.html#using-the-change-method

    如果您打算撤消此迁移,请改用reversible 方法。

    【讨论】:

    • 我正在使用mysql;我应该把它包括在我原来的问题中。感谢您的解释和提供链接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2015-08-07
    • 2019-07-14
    • 2013-12-30
    相关资源
    最近更新 更多