Я неправильно назвал столбец hased_password
вместо hashed_password
.
Как обновить схему базы данных, используя миграцию для переименования этого столбца?
Я неправильно назвал столбец hased_password
вместо hashed_password
.
Как обновить схему базы данных, используя миграцию для переименования этого столбца?
Ответы:
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
Тогда, 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
self.up
я бы не сказал self.down
« всегда должно быть наоборот». В зависимости от контекста вашей миграции. Простое противопоставление «противоположности» не может быть «правильной» миграцией.
def self.up
и def self.down
на def change
и он будет знать, как выполнить откат.
change
метод не является полным доказательством, поэтому склонны использовать up
и down
методы для сложных миграций.
На мой взгляд, в этом случае лучше использовать rake db:rollback
, затем отредактировать миграцию и снова запуститьrake db:migrate
.
Однако, если у вас есть данные в столбце, которые вы не хотите потерять, используйте rename_column
.
Если столбец уже заполнен данными и находится в рабочем состоянии, я бы рекомендовал пошаговый подход, чтобы избежать простоев в производстве в ожидании миграции.
Сначала я создал бы миграцию базы данных, чтобы добавить столбцы с новыми именами и заполнить их значениями из старого имени столбца.
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
в фоновом режиме.
Я понимаю, что это немного более сложный процесс, но я бы предпочел сделать это, чем иметь проблемы с моей производственной миграцией.
execute "Update table_name set correct_name_column_one = old_name_column_one"
http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
Под Available Transformations
rename_column(table_name, column_name, new_column_name):
Переименовывает столбец, но сохраняет тип и содержимое.
rename_column
.
Запустите приведенную ниже команду, чтобы создать файл миграции:
rails g migration ChangeHasedPasswordToHashedPassword
Затем в файле, созданном в db/migrate
папке, напишите, rename_column
как показано ниже:
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
Некоторые версии 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 - Миграции или Active Record Migrations .
Если ваш код не передан другому, тогда лучше всего просто rake db:rollback
отредактировать имя столбца в миграции иrake db:migrate
. Это оно
И вы можете написать другую миграцию, чтобы переименовать столбец
def change
rename_column :table_name, :old_name, :new_name
end
Это оно.
rake db:rollback
это отличное предложение. Но, как вы сказали, только если миграция еще не была продвинута.
В качестве альтернативы, если вы не состоите в браке с идеей миграции, для ActiveRecord есть неотразимая жемчужина, которая будет автоматически обрабатывать изменения имени, стиль Datamapper. Все, что вам нужно сделать, это изменить имя столбца в вашей модели (и убедитесь, что вы поместили Model.auto_upgrade! Внизу вашего model.rb) и альт! База данных обновляется на лету.
https://github.com/DAddYE/mini_record
Примечание. Чтобы предотвратить конфликты, вам нужно использовать nub db / schema.rb.
Все еще в бета-фазе и, очевидно, не для всех, но все же убедительный выбор (в настоящее время я использую его в двух нетривиальных производственных приложениях без проблем)
Если вам нужно поменять имена столбцов, вам нужно создать заполнитель, чтобы избежать ошибки повторяющегося имени столбца . Вот пример:
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
Если имеющиеся данные не важны для вас, вы можете просто снять исходную миграцию, используя:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
Без кавычек внесите изменения в исходную миграцию и снова запустите миграцию:
rake db:migrate
Для 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 ChangesNameInUsers
(или как ты бы хотел это назвать)
Откройте файл миграции, который только что был создан, и добавьте эту строку в метод (между def change
и end
):
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
Сохраните файл и запустите rake db:migrate
в консоли
Проверьте свой schema.db
, чтобы увидеть, действительно ли имя изменилось в базе данных!
Надеюсь это поможет :)
Давай поцелуй . Все это занимает три простых шага. Следующие работы для Rails 5.2 .
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
- таким образом, это станет совершенно ясным для сопровождающих базы кода позже. (используйте множественное число для названия таблицы).
# I prefer to explicitly write the
вверх 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
И вы отправитесь на гонки!
$: 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
Откройте консоль 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
Для этого типа он запускает метод 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
Я на рельсах 5.2, и пытаюсь переименовать столбец на устройстве пользователя.
rename_column
немного работал для меня, но в единственном числе :table_name
кинул «таблицы пользователя не найден» ошибка. Множество работало на меня.
rails g RenameAgentinUser
Затем измените файл миграции на этот:
rename_column :users, :agent?, :agent
Где: агент? старое имя столбца
Обновление - близкий родственник 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
Этот способ более эффективен, если мы используем другие методы изменения, такие как: удаление / добавление индекса / удаление индекса / добавление столбца, например, мы можем сделать следующее:
# 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
#...
Просто сгенерируйте миграцию с помощью команды
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 g migration RemoveStudentNameFromStudentS student_name:string
(студенты во множественном числе)?