ALTER TABLE lhm миграция удаляет существующие значения

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: грабли дБ: мигрировать
  2. Поле было успешно переименовано.
  3. Все существующие значения полей стираются, почему? Есть идеи?

Редактировать:

  • старый тип данных был float(11)
  • MYSQL 5.6

3 ответа

Я настоятельно рекомендую вам использовать методы, предоставленные вам от 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 где вы делаете CHANGE за change_columnи CHANGE за rename_column,

Официальные документы:

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

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

Можете ли вы сделать прямую миграцию рельсов так:

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

Я никогда не использовал lhm, так что это может быть невозможно?

Также вам может не понадобиться "FLOAT DEFAULT NULL" в текущем операторе SQL, если он уже указан в БД.

Надеюсь, это поможет.

Переименуйте 1st_name во временное_имя, а затем переименуйте 2nd_name в 1st_name, а затем переименуйте из временного_имя в 2nd_name

Другие вопросы по тегам