Как удалить столбцы с помощью миграции Rails

568

Какой синтаксис для удаления столбца таблицы базы данных через миграцию Rails?

Теги:
database
rails-migrations

18 ответов

838
Лучший ответ
remove_column :table_name, :column_name

Например:

remove_column :users, :hobby

удалит колонку хобби из таблицы пользователей.

  • 8
    И убедитесь, что делаете это внутри методов up и down , а не change , как объяснено в ответе @Powers.
  • 6
    @ XåpplI'-I0llwlg'I-Спасибо за комментарий. Метод изменения можно использовать для удаления столбца в приложениях на Rails 4, но его не следует использовать в Rails 3. Я соответствующим образом обновил свой ответ.
Показать ещё 3 комментария
364

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

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Для Rails 3 и выше

rails generate migration RemoveFieldNameFromTableName field_name:datatype
  • 17
    «Рельсы г» можно использовать как альтернативу «Рельсы генерируют»
  • 40
    rails g migration remove_field_name_from_table_name field_name:datatype также работает
Показать ещё 4 комментария
102

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

Предупреждения Rails 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 не является умным, когда дело доходит до remove_column, поэтому вы не сможете откатить эту миграцию.

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

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

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

Есть два хороших способа сделать это:

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

13

в рельсах 5 вы можете использовать эту команду в терминале:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

например, чтобы удалить столбец access_level (string) из пользователей таблицы:

rails generate migration remove_access_level_from_users access_level:string

а затем запустите:

rake db:migrate
10

Удалить столбцы для приложения 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
    «Удалить столбец таблицы» звучит странно, так от , кажется, лучший выбор здесь.
  • 0
    @SebastianvomMeer да, я согласен - английский лучше читается с «от»
8

Вы можете попробовать следующее:

remove_column :table_name, :column_name

(Официальная документация)

7

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

rails g migration remove_column_name_from_table_name column_name:data_type

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

rake db:migrate
6

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

Синтаксис:

remove_column: table_name,: column_name,: type

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

Пример:

remove_column :users, :last_name, :string

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

5

Чтобы удалить столбец из таблицы всего за 3 шага, выполните следующие действия:

  • напишите эту команду

rails g migration remove_column_from_table_name

после запуска этой команды в файле терминала, созданного этим именем и отметкой времени (remove_column from_table_name).

Затем перейдите к этому файлу.

  1. внутри файла вы должны написать

    remove_column :table_name, :column_name

  2. Наконец, идите в консоль, а затем выполните

    rake db:migrate

5

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

rails g migration RemoveColumnFromModel

После выполнения над командой вы можете проверить файл миграции. Код remove_column должен быть добавлен там

Затем перенесите db

rake db:migrate
4

remove_column в change метод поможет вам удалить столбец из таблицы.

class RemoveColumn < ActiveRecord::Migration
  def change
    remove_column :table_name, :column_name, :data_type
  end
end

Перейдите по этой ссылке для полной справки: http://guides.rubyonrails.org/active_record_migrations.html

1

Сделайте это так;

rails g migration RemoveColumnNameFromTables column_name:type

Ie rails g migration RemoveTitleFromPosts title:string

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

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

0

ВНИМАНИЕ: потеря данных

  • Вы потеряете данные, если удалите столбец из своей базы данных. Для этого выполните следующие шаги: три простых шага:

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

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

rails generate migration remove_fieldname_from_tablename fieldname:string

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

Пример:

  • В моем случае я хочу удалить 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

.... А потом ты отправляешься на гонки!

0

Просто, Вы можете удалить столбец

remove_column :table_name, :column_name

Например,

remove_column :posts, :comment
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню