Я неправильно назвал столбец 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
.источник
Если столбец уже заполнен данными и находится в рабочем состоянии, я бы рекомендовал пошаговый подход, чтобы избежать простоев в производстве в ожидании миграции.
Сначала я создал бы миграцию базы данных, чтобы добавить столбцы с новыми именами и заполнить их значениями из старого имени столбца.
Тогда я бы совершил именно это изменение и запихнул его в производство.
Затем, как только коммит будет запущен в производство, я запускаю.
Затем я обновил бы все представления / контроллеры, которые ссылались на старое имя столбца, на новое имя столбца. Запустите мой набор тестов и внесите только эти изменения. (Убедившись, что он работает локально и сначала пройдя все тесты!)
Тогда я бы подтолкнул эту фиксацию к производству.
На этом этапе вы можете удалить исходный столбец, не беспокоясь о простоях, связанных с самой миграцией.
Затем отправьте эту последнюю миграцию в рабочую среду и запустите ее
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
.Запустите приведенную ниже команду, чтобы создать файл миграции:
Затем в файле, созданном в
db/migrate
папке, напишите,rename_column
как показано ниже:источник
Из API:
Переименовывает столбец, но сохраняет тип и содержимое остается тем же.
источник
Некоторые версии Ruby on Rails поддерживают метод up / down для миграции, и если у вас есть метод up / down в вашей миграции, то:
Если у вас есть
change
метод в вашей миграции, то:Для получения дополнительной информации вы можете переместить: Ruby on Rails - Миграции или Active Record Migrations .
источник
Если ваш код не передан другому, тогда лучше всего просто
rake db:rollback
отредактировать имя столбца в миграции иrake db:migrate
. Это оноИ вы можете написать другую миграцию, чтобы переименовать столбец
Это оно.
источник
rake db:rollback
это отличное предложение. Но, как вы сказали, только если миграция еще не была продвинута.В качестве альтернативы, если вы не состоите в браке с идеей миграции, для ActiveRecord есть неотразимая жемчужина, которая будет автоматически обрабатывать изменения имени, стиль Datamapper. Все, что вам нужно сделать, это изменить имя столбца в вашей модели (и убедитесь, что вы поместили Model.auto_upgrade! Внизу вашего model.rb) и альт! База данных обновляется на лету.
https://github.com/DAddYE/mini_record
Примечание. Чтобы предотвратить конфликты, вам нужно использовать nub db / schema.rb.
Все еще в бета-фазе и, очевидно, не для всех, но все же убедительный выбор (в настоящее время я использую его в двух нетривиальных производственных приложениях без проблем)
источник
Если вам нужно поменять имена столбцов, вам нужно создать заполнитель, чтобы избежать ошибки повторяющегося имени столбца . Вот пример:
источник
Если имеющиеся данные не важны для вас, вы можете просто снять исходную миграцию, используя:
Без кавычек внесите изменения в исходную миграцию и снова запустите миграцию:
источник
Просто создайте новую миграцию, и в блоке используйте,
rename_column
как показано ниже.источник
Для Ruby on Rails 4:
источник
Вручную мы можем использовать следующий метод:
Мы можем редактировать миграцию вручную, например:
открыто
app/db/migrate/xxxxxxxxx_migration_file.rb
Обновить
hased_password
доhashed_password
Запустите следующую команду
Тогда это удалит вашу миграцию:
Это добавит вашу миграцию с обновленным изменением.
источник
Создайте файл миграции:
# Создает db / migrate / xxxxxxxxxx.rb
Отредактируйте миграцию, чтобы выполнить свою волю.
источник
Беги
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 .
1 Создать миграцию
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
- таким образом, это станет совершенно ясным для сопровождающих базы кода позже. (используйте множественное число для названия таблицы).2. Отредактируйте миграцию
# I prefer to explicitly write the
вверхand
внизmethods.
# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
3. Запустите ваши миграции
rake db:migrate
И вы отправитесь на гонки!
источник
Откройте этот файл миграции и измените этот файл, как показано ниже (введите оригинал
table_name
)источник
источник
Создайте миграцию Ruby on Rails :
Вставьте код в файл миграции (XXXXXfixcolumnname.rb) :
источник
Откройте консоль Ruby on Rails и введите:
источник
У вас есть два способа сделать это:
В этом типе он автоматически запускает обратный код при откате.
Для этого типа он запускает метод up, когда
rake db:migrate
и запускает метод down, когдаrake db:rollback
:источник
Я на рельсах 5.2, и пытаюсь переименовать столбец на устройстве пользователя.
rename_column
немного работал для меня, но в единственном числе:table_name
кинул «таблицы пользователя не найден» ошибка. Множество работало на меня.Затем измените файл миграции на этот:
Где: агент? старое имя столбца
источник
Обновление - близкий родственник create_table - change_table, используемый для изменения существующих таблиц. Он используется аналогично create_table, но объект, переданный блоку, знает больше хитростей. Например:
Этот способ более эффективен, если мы используем другие методы изменения, такие как: удаление / добавление индекса / удаление индекса / добавление столбца, например, мы можем сделать следующее:
источник
Просто сгенерируйте миграцию с помощью команды
После этого отредактируйте миграцию и добавьте следующую строку в метод изменения
Это должно сделать свое дело.
источник
Изменения в Rails 5
например:
если вы хотите изменить столбец student_name как имя
Примечание: - если вы не запускаете rails db: migrate
Вы можете сделать следующие шаги
Это удалит сгенерированный файл миграции, теперь вы можете исправить имя столбца
Если вы мигрировали (rails db: migrate), следующие опции для изменения имени столбца
источник
rails g migration RemoveStudentNameFromStudentS student_name:string
(студенты во множественном числе)?