Я неправильно назвал столбец hased_password
вместо hashed_password
.
Как обновить схему базы данных, используя миграцию, чтобы переименовать этот столбец?
Я неправильно назвал столбец hased_password
вместо hashed_password
.
Как обновить схему базы данных, используя миграцию, чтобы переименовать этот столбец?
rename_column :table, :old_column, :new_column
Update:
Возможно, вам захочется создать отдельный перенос, чтобы сделать это. (Переименуйте имя 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):
Переименовывает столбец, но сохраняет тип и содержимое.
Если столбец уже заполнен данными и живет в процессе производства, я бы рекомендовал поэтапный подход, чтобы избежать простоев в производстве, ожидая миграции.
Сначала я создал миграцию db, чтобы добавить столбцы с новыми именами и заполнить их значениями из старого имени столбца.
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
Затем в файле, сгенерированном в папке db/migrate
, напишите 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
затем измените имя столбца в процессе миграции и rake db:migrate
. Thats it
И вы можете написать еще одну миграцию, чтобы переименовать столбец
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. Все, что вам нужно сделать, это изменить имя столбца в вашей модели (и убедитесь, что вы поместили Model.auto_upgrade! Внизу вашего model.rb) и альт! База данных обновляется на лету.
https://github.com/DAddYE/mini_record
Примечание. Чтобы предотвратить конфликты, вам нужно использовать nub 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
до 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
Откройте этот файл миграции и измените этот файл, как показано ниже (Do enter your original 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
У вас есть два способа сделать это:
В этом типе он автоматически запускает обратный код, когда откатывается.
def change
rename_column :table_name, :old_column_name, :new_column_name
end
Для этого типа он запускает метод up 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
Откройте консоль Ruby on Rails и введите:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
Я на рельсах 5.2, и пытаюсь переименовать столбец на устройстве пользователя.
бит rename_column
работал для меня, но в единственном числе :table_name
rename_column
ошибку "Таблица пользователей не найдена". Множество работало на меня.
rails g RenameAgentinUser
Затем измените файл миграции на этот:
rename_column :users, :agent?, :agent
Где: агент? старое имя столбца
Просто выполните миграцию с помощью команды
rails g migration rename_hased_password
После этого отредактируйте перенос, добавьте следующую строку в метод изменения
rename_column :table, :hased_password, :hashed_password
Это должно сделать трюк.
Изменения в миграции на Rails 5
например:
рельсы г модель Студент студент_имя: строка возраст: целое число
если вы хотите изменить столбец student_name как имя
Примечание: - если вы не запускаете rails db: migrate
Вы можете сделать следующие шаги
рельсы d модель Студент имя студента: возраст строки: целое число
Это удалит сгенерированный файл миграции, теперь вы можете исправить имя столбца
рельсы g модель Имя студента: возраст строки: целое число
Если вы мигрировали (rails db: migrate), следующие опции для изменения имени столбца
рельсы и миграция RemoveStudentNameFromStudent имя_студента: строка
рельсы г миграции AddNameToStudent имя: строка
Пусть поцелуй. Все это занимает три простых шага. Следующие работы для Rails 5.2.
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
- таким образом, это будет совершенно ясно сопровождающим базы кода позже. (используйте множественное число для названия таблицы).
# я prefer to explicitly write the
methods.
вверх and
вниз methods.
#./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
def up
# rename_column :table_name, :old_column, :new_column
rename_column :students, :name, :full_name
end
def down
# Note that the columns are reversed
rename_column :students, :full_name, :name
end
end
rake db:migrate
И вы отправитесь на гонки!
Обновить. Близким кузеном 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
Этот способ более эффективен, если мы делаем это с другими альтернативными методами, такими как: 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
#...
Или используйте execute
для выполнения SQL, но не рекомендуется
execute "ALTER TABLE table_name change COLUMN old_column_name new_colmn_name column_data_type;"