【问题标题】:ALTER TABLE lhm migration deletes existing valuesALTER TABLE lhm 迁移删除现有值
【发布时间】:2016-03-14 10:22:15
【问题描述】:
require 'lhm'

class RenameField1ToField2ForTable < ActiveRecord::Migration
  def up
    Lhm.change_table :table do |m|
      m.ddl("ALTER TABLE %s CHANGE COLUMN field1 field2 FLOAT DEFAULT NULL AFTER field3" m.name)
    end
  end

  def down
    Lhm.change_table :table do |m|
      m.ddl("ALTER TABLE %s CHANGE COLUMN field2 field1 FLOAT DEFAULT NULL AFTER field3" m.name)
    end
  end
end

发生了什么:

  1. Rails-4.0:rake db:migrate
  2. 字段重命名成功。
  3. 所有现有字段值都被删除,为什么?有什么想法吗?

编辑:

  • 旧数据类型为float(11)
  • MYSQL 5.6

【问题讨论】:

  • 之前的数据类型是什么?
  • 旧数据类型为 float(11)
  • 我无法重现,看起来不像来自 MySQL。我不知道红宝石,所以我就停在那里。 SQLfiddle 如果有人想玩它sqlfiddle.com/#!2/096a5/1
  • MySQL 5.6 版。 Fiddle 看起来不错,就像我们的迁移一样工作。所以它没有mysql问题好吧:/

标签: mysql sql ruby-on-rails migration alter-table


【解决方案1】:

我强烈建议您使用 LHM 提供的模仿 Rails 的方法(如果您打算使用 LHM):

Lhm.change_table(:users) do |m|
  m.change_column(:old_column, :float)
  m.rename_column(:old_column, :new_column)
end

如果您查看方法定义,您会看到 LHM 正在执行 MODIFY,而您正在执行 CHANGEchange_column,以及 CHANGErename_column

官方文档:

更改列: https://docs.omniref.com/ruby/gems/lhm/2.2.0/symbols/Lhm::Migrator/change_column?d=415590290&n=0#

重命名列:https://docs.omniref.com/github/soundcloud/lhm/2.2.0/symbols/Lhm::Migrator/rename_column?d=409846811&n=4#

【讨论】:

    【解决方案2】:

    你能像这样进行直轨迁移吗:

    def change
      rename_column :table_name, :old_column, :new_column
    end
    

    我从未使用过 lhm,所以这可能是不可能的?

    如果数据库中已经指定了“FLOAT DEFAULT NULL”,那么您可能不需要在当前 SQL 语句中使用它。

    希望对您有所帮助。

    【讨论】:

    • 遗憾的是,通过 lhm 迁移,我无法采用正常的 Rails 方式。而且由于迁移已经完成,我只想知道为什么值被删除
    【解决方案3】:

    将 1st_name 重命名为temporary_name,然后将2nd_name 重命名为1st_name,然后将temporary_name 重命名为2nd_name

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 2020-11-24
      • 2018-03-04
      • 2017-10-27
      • 2016-12-02
      • 2018-12-01
      • 2018-12-13
      相关资源
      最近更新 更多