Rails DB Migration - Как удалить таблицу?

443

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

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

Я пробовал:

rails generate migration drop_tablename

но это только породило пустую миграцию.

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

  • 1
    Поскольку rails generate migration имеют параметры командной строки для генерации кода миграции для создания таблиц, добавления или изменения столбцов и т. Д., Было бы неплохо, если бы у него также была опция для удаления таблицы, но это не так. Конечно, писать up часть просто - просто позвоните drop_table - но down часть, создавая таблицу снова, может быть не всегда так просто, особенно если схема таблицы в вопросе была изменена миграцией после его первоначального создания , Возможно, кто-то должен предложить разработчикам Rails, что добавление такой опции было бы хорошей идеей.
  • 3
    @TeemuLeisti Как насчет просто скопировать и вставить текущее определение таблицы из schema.rb? Я делаю так все время ...
Показать ещё 1 комментарий
Теги:
database
migration
rake
ruby-on-rails-3

21 ответ

579
Лучший ответ

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

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

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

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

drop_table :table_name
  • 2
    Это сработало и для меня. Но при полной миграции (установка с нуля) таблица будет сначала создана, а затем снова удалена. Безопасно ли удалять и создавать миграции в будущем?
  • 1
    Если никакая другая миграция не использует эту таблицу (добавление / удаление столбцов, корректировка атрибутов столбцов и т. Д.), То это может не повредить чему-либо, чтобы удалить миграции создания / удаления. Однако я не уверен, что их удаление принесет вам значительные улучшения. Есть ли какая-то особая причина, по которой вы хотите их удалить?
Показать ещё 6 комментариев
342

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

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, и он закроет вам таблицу.

  • 11
    Для воссоздания удаляемой таблицы следует использовать миграцию вниз.
  • 1
    Эта миграция никогда не может быть отменена, даже в процессе разработки. Было бы лучше оставить пустую миграцию пустым?
Показать ещё 4 комментария
268

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

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

BAD - запуск rake db:migrate, а затем rake db:rollback произойдет сбой

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

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

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
179

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

$rails console

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

ActiveRecord::Migration.drop_table(:table_name)

И сделано, работал для меня!

  • 0
    Модель все еще там, пока вы не запустите rails destroy model User
  • 0
    Запускайте это, только если вы хотите избавиться от таблицы навсегда. Rails не будет знать об этом падении. Миграция не выполняется после выполнения этой команды. НЕ МОЖЕТ СОЗДАТЬ, УБРАТЬ ... И Т.Д. ОШИБКА SQLite3 :: SQLException: нет такой таблицы: начисления: DROP TABLE "sometable"
34

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

rails generate migration drop_table_xyz

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

drop_table :tablename

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

$ rails c

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

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

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

ActiveRecord::Migration.drop_table(:table_name)
22
  • rails g migration drop_users
  • изменить миграцию
    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end
  1. rake db: migrate
13

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

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

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

  • 1
    Странно, но, похоже, мне тоже придется это сделать.
  • 7
    Или вы можете просто использовать: raise ActiveRecord::IrreversibleMigration в методе self.down, чтобы вы в LEAST выдавали ошибку / уведомление, если вы когда-нибудь попытаетесь откатиться.
Показать ещё 1 комментарий
10

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

$ rails c

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

ActiveRecord::Migration.drop_table(:table_name)

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

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

$ rails runner "Util::Table.clobber 'table_name'"
7

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

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

Откройте консоль рельсов

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

Простым и официальным способом было бы следующее:

  rails g migration drop_tablename

Теперь перейдите на свой db/migrate и найдите файл, содержащий имя drop_tablename, как имя файла и отредактируйте его.

    def change
      drop_table :table_name
    end

Затем вам нужно запустить

    rake db:migrate 

на консоли.

4

ActiveRecord::Base.connection.drop_table :table_name

3

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

def change
  drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
3

Это не лучшее решение до сих пор, если вы не находитесь на ранней стадии разработки.

Разработка ENV. Вы можете удалить перенесенный файл из (db/migrate/name_of_migrated_file).

rake db:drop
rake db:create #This is unnecessary if using SQlite, but useful sometimes.
rake db:migrate

#or
rake db:migrate:reset
2

Запустите эту команду: -

rails g migration drop_table_name

затем:

rake db:migrate

или если вы используете базу данных MySql, то:

  1. войти с базой данных
  2. show databases;
  3. show tables;
  4. drop table_name;
  • 3
    Добавляет ли этот ответ что-либо к существующему, принятому ответу? Если нет, нет необходимости размещать это.
  • 1
    это создает пустую миграцию в рельсах 4.2, как уже говорилось в самом вопросе.
Показать ещё 1 комментарий
2

Мне нужно было удалить скрипты миграции вместе с самими таблицами...

class Util::Table < ActiveRecord::Migration

 def self.clobber(table_name)   
    # drop the table
    if ActiveRecord::Base.connection.table_exists? table_name
      puts "\n== " + table_name.upcase.cyan + " ! " 
           << Time.now.strftime("%H:%M:%S").yellow
      drop_table table_name 
    end

    # locate any existing migrations for a table and delete them
    base_folder = File.join(Rails.root.to_s, 'db', 'migrate')
    Dir[File.join(base_folder, '**', '*.rb')].each do |file|
      if file =~ /create_#{table_name}.rb/
        puts "== deleting migration: " + file.cyan + " ! "
             << Time.now.strftime("%H:%M:%S").yellow
        FileUtils.rm_rf(file)
        break
      end
    end
  end

  def self.clobber_all
    # delete every table in the db, along with every corresponding migration 
    ActiveRecord::Base.connection.tables.each {|t| clobber t}
  end

end

из запуска терминала:

$ rails runner "Util::Table.clobber 'your_table_name'"

или

$ rails runner "Util::Table.clobber_all"
1

лучший способ сделать это -

rails g migration Drop_table_Users

то сделайте следующее

rake db:migrate
1

Run

rake db:migrate:down VERSION=<version>

Где <version> - номер версии вашего файла миграции, который вы хотите вернуть.

Пример: -

rake db:migrate:down VERSION=3846656238
0

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

rails c

Тип

ActiveRecord::Migration.drop_table(:tablename)

Это хорошо работает для меня. Это удалит предыдущую таблицу. Не забудь бежать

rails db:migrate
0

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

$ rails db:migrate:up VERSION=[Here you can insert timestamp of table]

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

$rails db:drop
-2

Drop Table/Migration

запустить: - $ rails генерировать миграцию DropTablename

exp: - $ rails генерирует миграцию DropProducts

Ещё вопросы

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