Как переименовать столбец базы данных в миграции 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
вручную мы можем использовать следующий метод:
мы можем редактировать миграцию вручную, как:
открыть
app/db/migrate/xxxxxxxxx_migration_file.rb
обновление
hased_password
tohashed_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
Откройте консоль Ruby on Rails и введите:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
у вас есть два способа сделать это:
-
в этом типе он автоматически запускает обратный код его, когда откат.
def change rename_column :table_name, :old_column_name, :new_column_name end
-
для этого типа, он запускает метод, когда
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
#...