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

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

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

Я пробовал:

rails generate migration drop_tablename

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

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

443
26 окт. '10 в 4:52
источник поделиться
21 ответ

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

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

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

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

drop_table :table_name
579
26 окт. '10 в 4:54
источник

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

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

326
15 окт. '11 в 21:57
источник

Напишите миграцию вручную. Например. запустите 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
268
27 июля '15 в 18:25
источник

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

$rails console

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

ActiveRecord::Migration.drop_table(:table_name)

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

179
09 нояб. '12 в 1:38
источник

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

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)
34
26 мая '15 в 10:42
источник
  • 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
21
31 июля '15 в 17:20
источник

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

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

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

13
04 апр. '11 в 1:50
источник

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

$ rails c

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

ActiveRecord::Migration.drop_table(:table_name)

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

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

$ rails runner "Util::Table.clobber 'table_name'"
10
16 окт. '15 в 9:59
источник

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

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
05 мая '17 в 20:42
источник

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

ActiveRecord::Base.connection.execute("drop table table_name")
7
14 дек. '12 в 9:41
источник

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

  rails g migration drop_tablename

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

    def change
      drop_table :table_name
    end

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

    rake db:migrate 

на консоли.

6
28 июля '17 в 9:57
источник

ActiveRecord::Base.connection.drop_table :table_name

4
09 сент. '14 в 1:16
источник

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

def change
  drop_table(:users, force: true) if ActiveRecord::Base.connection.tables.include?('users')
end
3
20 нояб. '17 в 19:15
источник

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

Разработка 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
3
02 нояб. '15 в 9:59
источник

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

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"
2
13 февр. '13 в 23:55
источник

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

rails g migration drop_table_name

затем:

rake db:migrate

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

  1. войти с базой данных
  2. show databases;
  3. show tables;
  4. drop table_name;
2
17 июня '16 в 16:21
источник

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

rails g migration Drop_table_Users

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

rake db:migrate
1
14 сент. '15 в 15:52
источник

Run

rake db:migrate:down VERSION=<version>

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

Пример: -

rake db:migrate:down VERSION=3846656238
1
03 авг. '15 в 15:00
источник

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

rails c

Тип

ActiveRecord::Migration.drop_table(:tablename)

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

rails db:migrate
0
11 дек. '18 в 15:26
источник

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

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

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

$rails db:drop
0
03 июня '18 в 1:17
источник

Drop Table/Migration

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

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

-1
20 апр. '18 в 17:54
источник

Посмотрите другие вопросы по меткам или Задайте вопрос