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

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

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

Я пробовал:
rails generate migration drop_tablename ,
но это просто породило пустую миграцию.

Каков «официальный» способ отказаться от таблицы в Rails?

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

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

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

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

 drop_table :table_name 

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

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

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

Что касается кода миграции, я просто собираюсь процитировать сообщение Maxwell Holder Rails Migration Checklist

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 

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

 $rails console 

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

 ActiveRecord::Migration.drop_table(:table_name) 

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

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

 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) 
  1. rails g migration 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

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

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

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

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

 $ rails c 

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

 ActiveRecord::Migration.drop_table(:table_name) 

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

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

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

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

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

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

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 

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

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

  rails g migration drop_tablename 

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

  def change drop_table :table_name end 

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

  rake db:migrate 

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

ActiveRecord::Base.connection.drop_table :table_name

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

 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" 

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

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

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

 rails g migration drop_table_name 

тогда:

 rake db:migrate 

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

  1. логин с базой данных
  2. show databases;
  3. show tables;
  4. drop table_name;

лучший способ, которым вы можете

 rails g migration Drop_table_Users 

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

 rake db:migrate 

Бег

 rake db:migrate:down VERSION= 

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

Пример:-

 rake db:migrate:down VERSION=3846656238 

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

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

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

 $rails db:drop 

Падение таблицы / миграции

run: – $ rails генерирует миграцию DropTablename

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

Давайте будем гением компьютера.