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