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



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



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

714   25  

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 методы все еще применяются. Рельсы 3.1 получает change метод "знает, как перенести вашу базу данных и отменить его, когда миграция откатывается без необходимости записывать отдельный метод down"

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

ИМО, в этом случае лучше использовать 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 затем измените имя столбца в миграции и rake db:migrate. Вот оно

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

 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

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

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

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

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.РБ

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

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.РБ):

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.

the 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 миграционные изменения

например:

рельсы G модель студент имя_студента: строка возраст: целое число

Если вы хотите изменить 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
#...

Comments

    Ничего не найдено.