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

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

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

1181
задан 02 янв. '10 в 19:18
источник поделиться
24 ответов
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
1954
ответ дан 02 янв. '10 в 19:31
источник

IMO, в этом случае лучше использовать rake db:rollback. Затем отредактируйте свою миграцию и снова введите rake db:migrate. Однако, если у вас есть данные в столбце, который вы не хотите потерять, используйте rename_column.

60
ответ дан 03 янв. '10 в 3:55
источник

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

В разделе Available Transformations

rename_column(table_name, column_name, new_column_name):

Переименовывает столбец, но сохраняет тип и содержимое.

23
ответ дан 02 янв. '10 в 19:26
источник

Если столбец уже заполнен данными и живет в процессе производства, я бы рекомендовал поэтапный подход, чтобы избежать простоев в производстве, ожидая миграции.

Сначала я создал миграцию 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 в фоновом режиме.

Я понимаю, что это немного больше связано с процессом, но я предпочел бы сделать это, чем проблемы с моей производственной миграцией.

22
ответ дан 31 авг. '13 в 1:08
источник

Запустите команду ниже, чтобы создать файл миграции:

rails g migration ChangeHasedPasswordToHashedPassword

Затем в файле, сгенерированном в папке db/migrate, напишите rename_column, как показано ниже:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end
14
ответ дан 03 дек. '14 в 14:45
источник

Из API:

rename_column(table_name, column_name, new_column_name)

Он переименовывает столбец, но сохраняет тип и содержимое таким же.

13
ответ дан 18 февр. '11 в 14:15
источник

Некоторые версии 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 - Миграции или Миграции активной записи.

12
ответ дан 14 февр. '14 в 13:38
источник

Если ваш код не используется совместно с другим, лучшим вариантом является просто rake db:rollback затем измените имя столбца в процессе миграции и rake db:migrate. Thats it

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

 def change
    rename_column :table_name, :old_name, :new_name
  end

Вот оно.

10
ответ дан 04 дек. '13 в 17:34
источник

Если вам нужно переключить имена столбцов, вам нужно создать местозаполнитель, чтобы избежать ошибки с повторяющимся именем столбца. Вот пример:

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
7
ответ дан 10 сент. '13 в 0:10
источник

Просто создайте новую миграцию и в блоке используйте rename_column, как показано ниже.

rename_column :your_table_name, :hased_password, :hashed_password
6
ответ дан 24 марта '14 в 18:05
источник

В качестве альтернативного варианта, если вы не состоите в браке с идеей миграции, есть неотразимый камень для ActiveRecord, который автоматически обрабатывает изменения имен для вас, стиль Datamapper. Все, что вы делаете, это изменить имя столбца в вашей модели (и убедитесь, что вы положили Model.auto_upgrade! В нижней части вашей модели .rb) и альта! База данных обновляется "на лету".

https://github.com/DAddYE/mini_record

Примечание. Для предотвращения конфликтов вам понадобится nuke db/schema.rb.

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

6
ответ дан 30 янв. '12 в 23:00
источник

Для Ruby on Rails 4:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end
6
ответ дан 20 янв. '15 в 17:44
источник

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

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

Без кавычек, внесите изменения в исходную миграцию и снова выполните перенастройку:

rake db:migrate
5
ответ дан 26 июля '13 в 12:11
источник

В ручном режиме мы можем использовать метод ниже:

Мы можем редактировать миграцию вручную, например:

  • Откройте app/db/migrate/xxxxxxxxx_migration_file.rb

  • Обновить hased_password до hashed_password

  • Выполните следующую команду

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

Затем он удалит вашу миграцию:

$> rake db:migrate:up VERSION=xxxxxxxxx

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

5
ответ дан 14 июля '14 в 16:58
источник

Запустите 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, чтобы узнать, действительно ли имя изменилось в базе данных!

Надеюсь, что это поможет:)

4
ответ дан 23 дек. '16 в 19:10
источник

Сгенерировать файл миграции:

rails g migration FixName

# Создает db/migrate/xxxxxxxxxx.rb

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

class FixName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end
3
ответ дан 28 дек. '16 в 16:24
источник

Создание миграции 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
3
ответ дан 26 янв. '16 в 15:26
источник
$:  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
3
ответ дан 23 марта '16 в 8:49
источник

У вас есть два способа сделать это:

  • В этом типе он автоматически запускает обратный код, когда откатывается.

    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
    
2
ответ дан 29 янв. '15 в 13:47
источник

Откройте консоль Ruby on Rails и введите:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
2
ответ дан 03 июня '15 в 10:46
источник
 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end
1
ответ дан 08 июня '17 в 21:01
источник

Просто выполните миграцию с помощью команды

rails g migration rename_hased_password

После этого отредактируйте перенос, добавьте следующую строку в метод изменения

rename_column :table, :hased_password, :hashed_password

Это должно сделать трюк.

0
ответ дан 05 окт. '17 в 15:02
источник

Обновить. Близким кузеном 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
#...
-1
ответ дан 21 мая '16 в 8:32
источник

Или используйте execute для выполнения SQL, но не рекомендуется

execute "ALTER TABLE table_name change COLUMN old_column_name new_colmn_name column_data_type;"
-1
ответ дан 03 дек. '17 в 4:46

Другие вопросы по меткам или Задайте вопрос