Как удалить столбцы с помощью миграции 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методе, так как если вы укажете тип, возможен возврат к миграции. Из документации: и параметры будут игнорироваться , если присутствует. Может быть полезно предоставить их в методе миграции, чтобы его можно было восстановить. В этом случае и будет использоваться add_column. typeoptionschangetypeoptions
Николас

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


371

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

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Для Rails 3 и выше

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
«rails g» может использоваться как альтернатива «rails generate»
Noz

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

6
Следуем также отметить , что может сопровождаться белым разнесен списком filed_name: тип_данный, и будет создано соответствующее add_column и remove_column заявление: удаляет два атрибута с помощью одной миграции. Обратите внимание, что метод не поддерживается , поэтому вы должны написать и . AddXXXtoTTTRemoveXXXFromTTTrails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerremove_columnchangeupdown
Клаудио Флореани

3
Rails 4, кажется, поддерживает changeэто. Откат работает как надо.
Unknown_Guy

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

117

Rails 4 был обновлен, поэтому метод переноса может использоваться для переноса столбца, и перенос будет успешно откатан. Пожалуйста, прочитайте следующее предупреждение для приложений Rails 3:

Rails 3 Warning

Обратите внимание, что при использовании этой команды:

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

Убедитесь, что не используете метод change при удалении столбцов из таблицы базы данных (пример того, что вам не нужно в файле миграции в приложениях Rails 3):

  def change
    remove_column :table_name, :field_name
  end

Метод change в Rails 3 не очень умен, когда дело доходит до remove_column, поэтому вы не сможете откатить эту миграцию.


3
затем запустить грабли дБ: мигрировать
roxdurazo

1
@Powers - блестящий и четкий ответ - не могли бы вы уточнить следующее: «Метод change в Rails 3 не слишком умен, когда дело доходит до remove_column, поэтому вы не сможете откатить эту миграцию».
BKSpurgeon

1
@BKSpurgeon - в Rails 3, если вы используете changeметод, rake db:rollbackкоманда выдаст ошибку. rake db:rollbackв основном противоположность rake db:migrate. Эта ошибка была исправлена ​​в Rails 4 :)
Powers

2
В Rails 4 я пытался откатить столбец изменений. Он терпит неудачу и заявляет, что вы должны указать data_type (как в вашем даун-коде в вашем ответе)
rmcsharry

1
У меня возникла та же проблема, что и у @rmcsharry. Моя версия рельсов - 4.2.2, и я использовал метод изменения. Когда я пытался откатить, произошла ошибка, что remove_column является обратимым только при наличии типа.
М. Хабиб

38

В приложении rails4 можно использовать метод change также для удаления столбцов. Третий параметр - это data_type, а в необязательном разделе вы можете указать параметры. Это немного скрыто в разделе «Доступные преобразования» в документации .

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

Вы также можете сделать это, используя блок change_table, например:

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

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

Вот полный список поддерживаемых методов change_table:

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


15

в rails 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: table_name,: column_name,: type

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

Пример:

remove_column :users, :last_name, :string

Примечание . Если вы пропустите тип data_type , миграция удалит столбец успешно, но если вы откатите миграцию, она выдаст ошибку.


13

Ясные и простые инструкции для Rails 5.2

  • ВНИМАНИЕ: Вы потеряете данные, если удалите столбец из своей базы данных . Чтобы продолжить, см. Ниже:
  • Предупреждение: приведенные ниже инструкции предназначены для простых миграций . Для сложных миграций, например, с миллионами и миллионами строк, вам придется учитывать вероятность сбоев, вам также придется подумать о том, как оптимизировать ваши миграции, чтобы они выполнялись быстро, и о том, что пользователи будут использовать ваше приложение, пока процесс миграции происходит. Если у вас есть несколько баз данных, или если что-то сложно удаленно, не вините меня, если что-то пойдет не так!

1. Создайте миграцию

Запустите следующую команду в вашем терминале:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Примечание: имя таблицы должно быть во множественном числе в соответствии с соглашением о рельсах.

Пример:

В моем случае я хочу удалить acceptedстолбец (логическое значение) из quotesтаблицы:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

См. Документацию re: соглашение о добавлении / удалении полей в таблицу:

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

рельсы генерируют миграцию add_fieldname_to_tablename fieldname: fieldtype

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

Я также сделал краткое справочное руководство по Rails, которое можно найти здесь .



10
rails g migration RemoveXColumnFromY column_name:data_type

X = имя столбца
Y = имя таблицы

РЕДАКТИРОВАТЬ

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


3
«Удалить столбец в таблице» звучит странно, так от , кажется, лучший выбор здесь.
Себастьян Фом Меер

@SebastianvomMeer да, я согласен - английский читается намного лучше с «от»
BKSpurgeon

8

Чтобы удалить столбец из таблицы, необходимо выполнить следующую миграцию:

rails g migration remove_column_name_from_table_name column_name:data_type

Затем выполните команду:

rake db:migrate

5

Дайте ниже команду, которую он добавит в файл миграции самостоятельно

rails g migration RemoveColumnFromModel

После выполнения вышеуказанной команды вы можете проверить, что файл миграции код remove_column должен быть добавлен туда самостоятельно

Затем перенести БД

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
в файле миграции

Вы можете удалить столбец прямо в консоли rails, набрав:
ActiveRecord::Base.remove_column :table_name, :column_name


1

Делай как это;

rails g migration RemoveColumnNameFromTables column_name:type

Т.е. rails g migration RemoveTitleFromPosts title:string

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

Ссылка: сильная миграция



1

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

rails g migration RemoveAgeFromUsers age:string

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

rails db:migrate
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.