Как переименовать столбец базы данных в миграции Ruby on Rails?

Я неправильно назвал столбец hased_password вместо hashed_password.

Как обновить схему базы данных, используя миграцию для переименования этого столбца?

25 ответов


rename_column :table, :old_column, :new_column

обновление:

вы, вероятно, захотите создать отдельную миграцию для этого. (Переименуйте FixColumnName, как вы будете)

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

затем отредактируйте миграцию, чтобы выполнить свою волю.

# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
  def self.up
    rename_column :table_name, :old_column, :new_column
  end

  def self.down
    # rename back if you need or do something else or do nothing
  end
end

обновление для Rails 3.1

время up и down методы все еще применяются. Rails 3.1 получает change метод " знает, как перенести базу данных и отменить ее, когда миграция откатывается без необходимости записывать отдельный метод вниз"

rails g migration FixColumnName

class FixColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

если у вас есть целая куча столбцов для переименования или что-то, что потребовало бы повторения имени таблицы снова и снова.

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

можно использовать change_table чтобы все было немного аккуратнее.

class FixColumnNames < ActiveRecord::Migration
  def change
    change_table :table_name do |t|
      t.rename :old_column1, :new_column1
      t.rename :old_column2, :new_column2
      ...
    end
  end
end

спасибо, Luke &&Turadg, для поднятия этой темы.

потом просто db:migrate как обычно или как вы идете по своим делам.


обновление для Rails 4

при создании Migration что касается переименования столбца, Rails 4 генерирует change вместо up и down как упоминалось в приведенном выше ответе. Созданный change метод, как показано ниже :

$ > rails g migration ChangeColumnName

который создаст файл миграции, подобный этому:

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

IMO, в этом случае лучше использовать rake db:rollback. Затем отредактируйте миграцию и снова введите rake db:migrate. Однако, если у вас есть данные в столбце, который вы не хотите потерять, используйте rename_column.


http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

под Available Transformations

rename_column(table_name, column_name, new_column_name):

переименовывает столбец, но сохраняет тип и содержание.


если столбец уже заполнен данными и живет в производстве, я бы рекомендовал пошаговый подход, чтобы избежать простоя в производстве во время ожидания миграций.

сначала я бы создал миграцию БД, чтобы добавить столбцы с новым именем(именами) и заполнить их значениями из старого имени столбца.

class AddCorrectColumnNames < ActiveRecord::Migration
  def up
    add_column :table, :correct_name_column_one, :string
    add_column :table, :correct_name_column_two, :string

    puts 'Updating correctly named columns'
    execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
    end
  end

  def down
    remove_column :table, :correct_name_column_one
    remove_column :table, :correct_name_column_two
  end
end

тогда я бы совершил только это изменение и подтолкнул изменение к производству.

git commit -m 'adding columns with correct name'

затем, как только фиксация была нажата в производство я бы побежал.

Production $ bundle exec rake db:migrate

затем я бы обновил все представления / контроллеры, которые ссылались на старое имя столбца на новое имя столбца. Запустите мой набор тестов и зафиксируйте только эти изменения. (Убедившись, что он работает локально и сначала проходит все тесты!)

git commit -m 'using correct column name instead of old stinky bad column name'

тогда я бы подтолкнул это обязательство к производству.

в этот момент Вы можете удалить исходный столбец, не беспокоясь о каких-либо простоев, связанных с миграцией себя.

class RemoveBadColumnNames < ActiveRecord::Migration
  def up
    remove_column :table, :old_name_column_one
    remove_column :table, :old_name_column_two
  end

  def down
    add_column :table, :old_name_column_one, :string
    add_column :table, :old_name_column_two, :string
  end
end

затем нажмите эту последнюю миграцию в производство и запустите bundle exec rake db:migrate на заднем плане.

Я понимаю, что это немного больше связано с процессом, но я бы предпочел сделать это, чем иметь проблемы с моей производственной миграцией.


выполните следующую команду, чтобы создать файл миграции:

rails g migration ChangeHasedPasswordToHashedPassword

затем в файле, сгенерированном в пишите rename_column как показано ниже:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end

из API:

rename_column(table_name, column_name, new_column_name)

он переименовывает столбец, но сохраняет тип и содержимое остается неизменным.


некоторые версии Ruby on Rails поддерживают метод up / down для миграции, и если у вас есть метод up/down в вашей миграции, то:

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

Если у вас change метод в вашей миграции, затем:

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

для получения дополнительной информации, вы можете двигаться: Ruby on Rails-миграции или Активные Миграции Записей.


Если ваш код не совместно с другим, то лучший вариант-сделать просто rake db:rollback затем измените имя столбца в migration и rake db:migrate. Вот оно!--4-->

и вы можете написать другую миграцию, чтобы переименовать столбец

 def change
    rename_column :table_name, :old_name, :new_name
  end

вот и все.


Если вам нужно переключить имена столбцов, вам нужно будет создать заполнитель, чтобы избежать дублировать имя столбца ошибка. Вот пример:

class SwitchColumns < ActiveRecord::Migration
  def change
    rename_column :column_name, :x, :holder
    rename_column :column_name, :y, :x
    rename_column :column_name, :holder, :y
  end
end

в качестве альтернативного варианта, если вы не женаты на идее миграции, есть убедительный камень для ActiveRecord, который будет обрабатывать изменения имени автоматически для вас, стиль Datamapper. Все, что вам нужно сделать, это изменить имя столбца в вашей модели (и убедитесь, что вы положили модель.auto_upgrade! в нижней части модели.РБ) и Виола! База обновляется на лету.

https://github.com/DAddYE/mini_record

Примечание: вам понадобится для Nuke db / schema.rb для предотвращения конфликтов

все еще в бета-фазах и, очевидно, не для всех, но все же убедительный выбор (в настоящее время я использую его в двух нетривиальных производственных приложениях без проблем)


Если настоящие данные не важны для вас, вы можете просто снять исходную миграцию, используя:

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

без кавычек, затем внесите изменения в исходную миграцию и снова запустите миграцию вверх по:

rake db:migrate

просто создайте новую миграцию и в блоке используйте rename_column Как ниже.

rename_column :your_table_name, :hased_password, :hashed_password

для Ruby on Rails 4:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end

вручную мы можем использовать следующий метод:

мы можем редактировать миграцию вручную, как:

  • открыть app/db/migrate/xxxxxxxxx_migration_file.rb

  • обновление hased_password to hashed_password

  • выполните следующую команду

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

тогда он удалит вашу миграцию:

$> rake db:migrate:up VERSION=xxxxxxxxx

Он добавит вашу миграцию с обновленным изменением.


создать файл миграции:

rails g migration FixName

# создает db/migrate / xxxxxxxxxx.rb

отредактируйте миграцию, чтобы выполнить свою волю.

class FixName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

$:  rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

Откройте этот файл миграции и измените этот файл, как показано ниже(введите свой оригинал table_name)

class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end

выполнить rails g migration ChangesNameInUsers (или как бы вы его ни назвали)

откройте только что созданный файл миграции и добавьте эту строку в метод (между def change и end):

rename_column :table_name, :the_name_you_want_to_change, :the_new_name

сохраните файл и запустите rake db:migrate в консоли

Проверьте ваш schema.db чтобы увидеть, действительно ли имя изменилось в базе данных!

надеюсь, что это помогает :)


создание миграции Ruby on Rails:

$:> rails g migration Fixcolumnname

вставьте код в файл миграции (XXXXXfixcolumnname.rb):

class Fixcolumnname < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end

Откройте консоль Ruby on Rails и введите:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

у вас есть два способа сделать это:

  1. в этом типе он автоматически запускает обратный код его, когда откат.

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. для этого типа, он запускает метод, когда rake db:migrate и запускает метод down, когда rake db:rollback:

    def self.up
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
    def self.down
      rename_column :table_name,:new_column_name,:old_column_name
    end
    

Я на рельсах 5.2 и пытаюсь переименовать столбец на пользователе devise.

на rename_column бит работал для меня, но единственное число :table_name бросил ошибку "таблица пользователя не найдена". Множественное число меня устраивало.

rails g RenameAgentinUser

затем измените файл миграции для этого:

rename_column :users, :agent?, :agent

где :агент? это старое имя столбца.


просто создайте миграцию с помощью команды

rails g migration rename_hased_password

после этого отредактируйте миграцию добавьте следующую строку в метод изменения

rename_column :table, :hased_password, :hashed_password

Это должно сделать трюк.


изменения миграции Rails 5

например:

rails G модель Student_name:строка возраст: целое число

Если вы хотите изменить student_name


обновление - близкий родственник create_table-change_table, используемый для изменения существующих таблиц. Он используется аналогично create_table но объект уступал блок знает больше трюков. Например:

class ChangeBadColumnNames < ActiveRecord::Migration
  def change
    change_table :your_table_name do |t|
      t.rename :old_column_name, :new_column_name
    end
  end
end

этот способ более эффективен, если мы делаем с другими методами alter, такими как: remove/add index/remove index/add column, например, мы можем сделать дальше, как:

# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...