Миграция БД Rails - Как удалить таблицу? - PullRequest
470 голосов
/ 26 октября 2010

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

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

Я пытался:

rails generate migration drop_tablename

, но это только привело к пустой миграции.

Каков "официальный" способ удаления таблицы в Rails?

Ответы [ 21 ]

611 голосов
/ 26 октября 2010

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

Информацию о том, как выполнять различные задачи в миграции, можно найти здесь:

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

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

drop_table :table_name
336 голосов
/ 15 октября 2011

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

rails generate migration DropProductsTable

Это создаст файл .rb в / db / migrate / like 20111015185025_drop_products_table.rb

Теперь отредактируйте этот файлчтобы выглядеть так:

class DropProductsTable < ActiveRecord::Migration
  def up
    drop_table :products
  end

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

Единственное, что я добавил, было drop_table :products и raise ActiveRecord::IrreversibleMigration.

Затем запустите rake db:migrate, и он уронит вам таблицу.

293 голосов
/ 27 июля 2015

Напишите вашу миграцию вручную. Например. запустить rails g migration DropUsers.

Что касается кода миграции, я просто процитирую пост Максвелла Холдера Контрольный список миграции Rails

BAD - работает rake db:migrate, а затем rake db:rollback завершится ошибкой

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users
  end
end

ХОРОШО - показывает намерение, что миграция не должна быть обратимой

class DropUsers < ActiveRecord::Migration
  def up
    drop_table :users
  end

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end

ЛУЧШЕ - на самом деле обратимо

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users do |t|
      t.string :email, null: false
      t.timestamps null: false
    end
  end
end
188 голосов
/ 09 ноября 2012

Хотя ответы, представленные здесь, работают должным образом, я хотел что-то более «простое», я нашел это здесь: ссылка Сначала введите консоль rails:

$rails console

Затем просто введите:

ActiveRecord::Migration.drop_table(:table_name)

И готово, у меня сработало!

35 голосов
/ 26 мая 2015

Вам необходимо создать новый файл миграции, используя следующую команду

rails generate migration drop_table_xyz

и записать код drop_table во вновь созданный файл миграции (db /igration / xxxxxxx_drop_table_xyz) как

drop_table :tablename

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

$ rails c

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

ActiveRecord::Base.connection.execute("drop table table_name")

или вы можете использовать более упрощенную команду

ActiveRecord::Migration.drop_table(:table_name)
21 голосов
/ 31 июля 2015
  1. рельсы г миграции drop_users
  2. редактировать миграцию
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. rake db: migrate
13 голосов
/ 04 апреля 2011

Я думаю, чтобы быть полностью «официальным», вам нужно создать новую миграцию и поместить drop_table в self.up. Затем метод self.down должен содержать весь код для полного воссоздания таблицы. Предположительно, этот код можно было просто взять из schema.rb во время создания миграции.

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

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

11 голосов
/ 16 октября 2015

Вы можете просто уронить стол с консоли рельсов.сначала откройте консоль

$ rails c

, затем вставьте эту команду в консоль

ActiveRecord::Migration.drop_table(:table_name)

и замените table_name на таблицу, которую вы хотите удалить.

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

$ rails runner "Util::Table.clobber 'table_name'"
8 голосов
/ 05 мая 2017

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

http://guides.rubyonrails.org/active_record_migrations.html#reverting-previous-migrations

Создание миграции:

rails generate migration revert_create_tablename

Написать миграцию:

require_relative '20121212123456_create_tablename'

class RevertCreateTablename < ActiveRecord::Migration[5.0]
  def change
    revert CreateTablename    
  end
end

Таким образом, вы также можете выполнить откат и использовать для отмены любой миграции

7 голосов
/ 28 июля 2017

Простой и официальный способ был бы таким:

  rails g migration drop_tablename

Теперь перейдите в db / migrate и найдите свой файл, который содержит имя_папки в качестве имени файла, и отредактируйте его так:

    def change
      drop_table :table_name
    end

Тогда вам нужно запустить

    rake db:migrate 

на вашей консоли.

...