Як скинути стовпці за допомогою міграції Rails


Відповіді:


917
remove_column :table_name, :column_name

Наприклад:

remove_column :users, :hobby

видалить стовпчик хобі з таблиці користувачів.


9
І не забудьте зробити це всередині upта downметодами, а не change, як пояснено у відповіді @Powers.
XåpplI'-I0llwlg'I -

7
@ XåpplI'-I0llwlg'I-Дякую за коментар. Метод зміни можна використовувати для опускання стовпця в додатках Rails 4, але не повинен застосовуватися в Rails 3. Я відповідно оновив свою відповідь.
Повноваження

9
Ви також можете використовувати remove_column :table_name, :column_name, :type, :optionsв межах changeметоду, оскільки якщо вказати тип повернення, можлива міграція. З документації: Параметри typeі optionsігноруються, якщо вони є. Це може бути корисно надати їх changeметодом міграції, щоб їх можна було повернути. У такому випадку typeі optionsбуде використовуватися add_column.
Ніколя

24
У Rails4 ви можете видалити стовпець у changeметоді, але лише якщо вказати тип стовпця. Напр remove_column, :table_name, :column_name, :column_type. В іншому випадку ви отримаєте таку помилку при спробі запуску міграції:remove_column is only reversible if given a type
Деніс,

5
Можливо, варто відзначити в головній відповіді, що при видаленні стовпця не видаляється відповідний індекс, якщо він існує
sameers

371

Для старих версій Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Для рейок 3 і вище

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
"рейки g" можуть бути використані в якості альтернативи "рейковій генерації"
Noz

44
rails g migration remove_field_name_from_table_name field_name:datatypeтакож працює
Стюарт Нельсон

6
Зауважте також, що AddXXXtoTTTпісля RemoveXXXFromTTTможе бути доданий список із зазначенням білого інтервалу file_name: data_type та будуть створені відповідні оператори add_column та Remove_column: rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerвидалення двох атрибутів за допомогою однієї міграції. Зауважте також, що метод remove_columnне підтримується change, тому вам потрібно написати і upі down.
Клаудіо Флореані

3
Здається, Rails 4 підтримує changeце. Відкат працює як слід.
Невідомо_Пригоди

2
@AdamGrant Я думаю, що якщо ви використовуєте changeметод, який можна повернути *, вам потрібно повідомити про тип даних (та всі інші модифікатори поля), тож якщо ви відкатуєте цю міграцію, поле можна буде правильно відтворити. * Коли я скажу, що повернуто, це стосується структури бази даних, звичайно, дані з цього стовпця, очевидно, будуть втрачені.
RFVoltolini

117

Rails 4 було оновлено, тож метод зміни може бути використаний під час міграції для скидання стовпця, і міграція буде успішно відкатана. Будь ласка, прочитайте таке попередження для додатків Rails 3:

Рейки 3 Попередження

Зауважте, що при використанні цієї команди:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

Згенерована міграція виглядатиме приблизно так:

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

Переконайтеся, що не використовуйте метод змін, видаляючи стовпці з таблиці бази даних (приклад того, що ви не хочете, щоб перенести файл міграції в додатках Rails 3):

  def change
    remove_column :table_name, :field_name
  end

Метод зміни в Rails 3 не є розумним, коли справа доходить до видалення колонки, тому ви не зможете відкатати цю міграцію.


3
потім запустіть граблі db: migrate
roxdurazo

1
@Powers - яскрава і чітка відповідь - чи зможете ви детальніше розглянути наступне: "Метод зміни в Rails 3 не розумний, коли справа доходить до Remove_column, тому ви не зможете відкатати цю міграцію".
BKSpurgeon

1
@BKSpurgeon - Якщо ви використовуєте changeметод Rails 3 , тоді rake db:rollbackкоманда помилиться . rake db:rollbackв основному протилежне rake db:migrate. Ця помилка була виправлена ​​в Rails 4 :)
Повноваження

2
У Rails 4 я намагався відкатати стовпчик змін. Він не вдається і заявляє, що ви повинні вказати тип_типу (як у вашому коді вниз у своїй відповіді)
rmcsharry

1
У мене сталася та сама проблема, що і в @rmcsharry. Моя версія рейки - 4.2.2, і я використав метод зміни. коли я намагався відкатати, сталася помилка, що Remove_column є оборотним лише у випадку, якщо задано тип.
М. Хабіб

38

У додатку rails4 можна використовувати метод зміни також для видалення стовпців. Третій парам - тип даних і в додатковому варіанті далі ви можете надати варіанти. Це трохи приховано у розділі "Доступні перетворення" документації .

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

27

Є два хороших способи зробити це:

Remove_column

Ви можете просто використовувати Remove_column, наприклад:

remove_column :users, :first_name

Це добре, якщо вам потрібно внести лише одну зміну до вашої схеми.

блок_ змінний блок

Ви також можете це зробити, використовуючи блок змінної змінної, наприклад:

change_table :users do |t|
  t.remove :first_name
end

Я вважаю за краще це, оскільки мені здається більш розбірливим, і ви можете внести відразу кілька змін.

Ось повний список підтримуваних методів змін змін:

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


15

в рейках 5 ви можете використовувати цю команду в терміналі:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

наприклад, щоб видалити стовпець access_level (рядок) у користувачів таблиці:

rails generate migration remove_access_level_from_users access_level:string

а потім запустіть:

rake db:migrate

14

Створіть міграцію, щоб видалити стовпчик таким чином, що якщо він переміщений ( rake db:migrate), він повинен скинути стовпець . І слід додати стовпчик назад, якщо ця міграція відкидається ( rake db:rollback).

Синтаксис:

Remove_column: ім'я таблиці,: ім'я стовпця,: тип

Видаляє стовпчик, а також додає стовпчик назад, якщо міграція відкидається .

Приклад:

remove_column :users, :last_name, :string

Примітка . Якщо ви пропустите тип даних , міграція буде успішно видалити стовпець, але якщо ви повернете міграцію, вона призведе до помилки.


13

Чіткі та прості інструкції для рейок 5.2

  • ПОПЕРЕДЖЕННЯ. Ви втратите дані, якщо вилучите стовпець зі своєї бази даних . Для продовження див. Нижче:
  • Попередження: наведені нижче інструкції стосуються тривіальних міграцій . Для складних міграцій, наприклад, мільйонів і мільйонів рядків, вам доведеться враховувати можливість відмов, вам також доведеться подумати про те, як оптимізувати міграції, щоб вони швидко проходили, і про можливість того, що користувачі будуть використовувати ваш додаток, поки відбувається процес міграції. Якщо у вас є кілька баз даних або якщо щось віддалено ускладнене, тоді не звинувачуйте мене, якщо щось піде не так!

1. Створіть міграцію

Виконайте таку команду у своєму терміналі:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Примітка: Назва таблиці має бути у множині згідно з умовами рейки.

Приклад:

У моєму випадку я хочу видалити acceptedстовпець (булеве значення) із quotesтаблиці:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

Дивіться документацію про : конвенцію при додаванні / видаленні полів до таблиці:

Існує спеціальний синтаксичний ярлик для генерації міграцій, які додають поля до таблиці.

рейки генерують міграцію add_fieldname_to_tablename назва поля: тип поля

2. Перевірте міграцію

# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
  # with rails 5.2 you don't need to add a separate "up" and "down" method.
  def change
    remove_column :quotes, :accepted, :boolean
  end
end

3. Запустіть міграцію

rake db:migrate

.... І тоді ви їдете на перегони!


тепер міграції також можуть бути виконані якrails db:migrate
Імран Алі

12

Видалити стовпці для програми RAILS 5

rails g migration Remove<Anything>From<TableName> [columnName:type]

Команда вище генерує файл міграції всередині db/migrateкаталогу. Сніп-удар - це один із стовпців для видалення зі прикладу таблиці, згенерований генератором Rails

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

Я також зробив короткий довідник щодо рейок, який можна знайти тут .



10
rails g migration RemoveXColumnFromY column_name:data_type

X = назва стовпця
Y = назва таблиці

EDIT

Змінено відповідно RemoveXColumnToYдо RemoveXColumnFromYкоментарів - забезпечує більшу чіткість того, що насправді робить міграція.


3
«Видалити стовпець в таблиці» звучить дивно, так від , здається, кращий вибір тут.
Себастьян vom Meer

@SebastianvomMeer так, я погоджуюсь - англійська читає набагато краще з «від»
BKSpurgeon

8

Щоб видалити стовпець із таблиці, потрібно виконати наступну міграцію:

rails g migration remove_column_name_from_table_name column_name:data_type

Потім запустіть команду:

rake db:migrate

5

Дайте команду нижче, вона додасть у файл міграції самостійно

rails g migration RemoveColumnFromModel

Після запуску вище команди ви можете перевірити файл міграції

Потім мігруйте db

rake db:migrate


5

Для видалення стовпця з таблиці за допомогою простих 3 кроків:

  1. написати цю команду

rails g migration remove_column_from_table_name

після запуску цієї команди в терміналі один файл, створений цим ім'ям та часовою маркою (Remove_column from_table_name).

Потім перейдіть до цього файлу.

  1. всередині файлу ви повинні написати

    remove_column :table_name, :column_name

  2. Нарешті перейдіть до консолі, а потім зробіть

    rake db:migrate


2

Ось ще один з рейки консолі

ActiveRecord::Migration.remove_column(:table_name, :column_name)


1

Через
remove_column :table_name, :column_name
файл міграції

Ви можете видалити стовпчик безпосередньо в консолі рейки, ввівши:
ActiveRecord::Base.remove_column :table_name, :column_name


1

Робіть так;

rails g migration RemoveColumnNameFromTables column_name:type

Тобто rails g migration RemoveTitleFromPosts title:string

У будь-якому випадку, було б краще подумати про час простою, оскільки ActiveRecord кешує стовпці бази даних під час виконання, тому якщо ви скинете стовпець, це може спричинити винятки, поки ваша програма не перезавантажиться.

Ref: Сильна міграція


1

Просто стовпчик можна видалити

remove_column :table_name, :column_name

Наприклад,

remove_column :posts, :comment

1

спершу спробуйте створити міграційний файл із командою:

rails g migration RemoveAgeFromUsers age:string

а потім у кореневому каталозі проекту запустіть міграцію, виконану команду:

rails db:migrate
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.