Rails DB Migration - How To Drop a Table?

Ruby on-RailsRuby on-Rails-3MigrationRollbackDrop Table

Ruby on-Rails Problem Overview


I added a table that I thought I was going to need, but now no longer plan on using it. How should I remove that table?

I've already run migrations, so the table is in my database. I figure rails generate migration should be able to handle this, but I haven't figured out how yet.

I've tried:

rails generate migration drop_tablename

but that just generated an empty migration.

What is the "official" way to drop a table in Rails?

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

You won't always be able to simply generate the migration to already have the code you want. You can create an empty migration and then populate it with the code you need.

You can find information about how to accomplish different tasks in a migration here:

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

More specifically, you can see how to drop a table using the following approach:

drop_table :table_name

Solution 2 - Ruby on-Rails

First generate an empty migration with any name you'd like. It's important to do it this way since it creates the appropriate date.

rails generate migration DropProductsTable

This will generate a .rb file in /db/migrate/ like 20111015185025_drop_products_table.rb

Now edit that file to look like this:

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

  def down
    raise ActiveRecord::IrreversibleMigration
  end
end

The only thing I added was drop_table :products and raise ActiveRecord::IrreversibleMigration.

Then run rake db:migrate and it'll drop the table for you.

Solution 3 - Ruby on-Rails

Write your migration manually. E.g. run rails g migration DropUsers.

As for the code of the migration I'm just gonna quote Maxwell Holder's post [Rails Migration Checklist][1]

BAD - running rake db:migrate and then rake db:rollback will fail

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

GOOD - reveals intent that migration should not be reversible

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

  def down
    fail ActiveRecord::IrreversibleMigration
  end
end

BETTER - is actually reversible

class DropUsers < ActiveRecord::Migration
  def change
    drop_table :users do |t|
      t.string :email, null: false
      t.timestamps null: false
    end
  end
end

[1]: http://maxwellholder.com/blog/rails-migration-checklist "Rails Migration Checklist"

Solution 4 - Ruby on-Rails

Warning: Do this at your own risk, as @z-atef and @nzifnab correctly point out, Rails will not be aware of these changes, your migration sequence fill fail and your schema will be different from your coworkers'. This is meant as a resource for locally tinkering with development only.


While the answers provided here work properly, I wanted something a bit more 'straightforward', I found it here: link First enter rails console:

$rails console

Then just type:

ActiveRecord::Migration.drop_table(:table_name)

And done, worked for me!

Solution 5 - Ruby on-Rails

You need to to create a new migration file using following command

rails generate migration drop_table_xyz

and write drop_table code in newly generated migration file (db/migration/xxxxxxx_drop_table_xyz) like

drop_table :tablename

Or if you wanted to drop table without migration, simply open rails console by

$ rails c

and execute following command

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

or you can use more simplified command

ActiveRecord::Migration.drop_table(:table_name)

Solution 6 - Ruby on-Rails

  1. rails g migration drop_users
  2. edit the migration

    class DropUsers < ActiveRecord::Migration
      def change
        drop_table :users do |t|
          t.string :name
          t.timestamps
        end
      end
    end

3. rake db:migrate

Solution 7 - Ruby on-Rails

The simple and official way would be this:

  rails g migration drop_tablename

Now go to your db/migrate and look for your file which contains the drop_tablename as the filename and edit it to this.

    def change
      drop_table :table_name
    end

Then you need to run

    rake db:migrate 

on your console.

Solution 8 - Ruby on-Rails

I wasn't able to make it work with migration script so I went ahead with this solution. Enter rails console using the terminal:

rails c

Type

ActiveRecord::Migration.drop_table(:tablename)

It works well for me. This will remove the previous table. Don't forget to run

rails db:migrate

Solution 9 - Ruby on-Rails

I think, to be completely "official", you would need to create a new migration, and put drop_table in self.up. The self.down method should then contain all the code to recreate the table in full. Presumably that code could just be taken from schema.rb at the time you create the migration.

It seems a little odd, to put in code to create a table you know you aren't going to need anymore, but that would keep all the migration code complete and "official", right?

I just did this for a table I needed to drop, but honestly didn't test the "down" and not sure why I would.

Solution 10 - Ruby on-Rails

You can roll back a migration the way it is in the guide:

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

Generate a migration:

rails generate migration revert_create_tablename

Write the migration:

require_relative '20121212123456_create_tablename'
 
class RevertCreateTablename < ActiveRecord::Migration[5.0]
  def change
    revert CreateTablename    
  end
end

This way you can also rollback and can use to revert any migration

Solution 11 - Ruby on-Rails

you can simply drop a table from rails console. first open the console

$ rails c

then paste this command in console

ActiveRecord::Migration.drop_table(:table_name)

replace table_name with the table you want to delete.

you can also drop table directly from the terminal. just enter in the root directory of your application and run this command

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

Solution 12 - Ruby on-Rails

Alternative to raising exception or attempting to recreate a now empty table - while still enabling migration rollback, redo etc -

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

Solution 13 - Ruby on-Rails

Open you rails console

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

Solution 14 - Ruby on-Rails

ActiveRecord::Base.connection.drop_table :table_name

Solution 15 - Ruby on-Rails

You can't simply run drop_table :table_name, instead you can create an empty migration by running: rails g migration DropInstalls

You can then add this into that empty migration:

class DropInstalls < ActiveRecord::Migration
  def change
    drop_table :installs
  end
end

Then run rails db:migrate in the command line which should remove the Installs table The solution was found here

Solution 16 - Ruby on-Rails

if anybody is looking for how to do it in SQL.

type rails dbconsole from terminal

enter password

In console do

USE db_name;

DROP TABLE table_name;

exit

Please dont forget to remove the migration file and table structure from schema

Solution 17 - Ruby on-Rails

I needed to delete our migration scripts along with the tables themselves ...

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

from terminal window run:

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

or

$ rails runner "Util::Table.clobber_all"

Solution 18 - Ruby on-Rails

Run

rake db:migrate:down VERSION=<version>

Where <version> is the version number of your migration file you want to revert.

Example:-

rake db:migrate:down VERSION=3846656238

Solution 19 - Ruby on-Rails

the best way you can do is

rails g migration Drop_table_Users

then do the following

rake db:migrate

Solution 20 - Ruby on-Rails

Helpful documentation

In migration you can drop table by:

drop_table(table_name, **options)

options:

:force Set to :cascade to drop dependent objects as well. Defaults to false

:if_exists Set to true to only drop the table if it exists. Defaults to false

Example:

  1. Create migration for drop table, for example we are want to drop User table

    rails g migration DropUsers
    
    Running via Spring preloader in process 13189
       invoke  active_record
       create    db/migrate/20211110174028_drop_users.rb
    
  2. Edit migration file, in our case it is db/migrate/20211110174028_drop_users.rb

    class DropUsers < ActiveRecord::Migration[6.1]
      def change
        drop_table :users, if_exist: true
      end
    end
    
  3. Run migration for dropping User table

    rails db:migrate
    
    == 20211110174028 DropUsers: migrating ===============================
    -- drop_table(:users, {:if_exist=>true})
       -> 0.4607s
    

Solution 21 - Ruby on-Rails

Run this command:-

rails g migration drop_table_name

then:

rake db:migrate

or if you are using MySql database then:

  1. login with database
  2. show databases;
  3. show tables;
  4. drop table_name;

Solution 22 - Ruby on-Rails

Drop Table/Migration

run:- $ rails generate migration DropTablename

exp:- $ rails generate migration DropProducts

Solution 23 - Ruby on-Rails

if you want to drop a specific table you can do

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

otherwise if you want to drop all your database you can do

$rails db:drop

Solution 24 - Ruby on-Rails

If you want to delete the table from the schema perform below operation --

rails db:rollback

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJason WhitehornView Question on Stackoverflow
Solution 1 - Ruby on-RailsPeteView Answer on Stackoverflow
Solution 2 - Ruby on-RailsBrandon O'RourkeView Answer on Stackoverflow
Solution 3 - Ruby on-RailsBeder Acosta BorgesView Answer on Stackoverflow
Solution 4 - Ruby on-RailslllllllView Answer on Stackoverflow
Solution 5 - Ruby on-RailsShahzad TariqView Answer on Stackoverflow
Solution 6 - Ruby on-RailsAashish SainiView Answer on Stackoverflow
Solution 7 - Ruby on-RailsMahesh MestaView Answer on Stackoverflow
Solution 8 - Ruby on-RailsSrikanth VView Answer on Stackoverflow
Solution 9 - Ruby on-RailsFrancis PotterView Answer on Stackoverflow
Solution 10 - Ruby on-RailsSidneyView Answer on Stackoverflow
Solution 11 - Ruby on-Railsfarz bhullarView Answer on Stackoverflow
Solution 12 - Ruby on-RailsaqwanView Answer on Stackoverflow
Solution 13 - Ruby on-Railsmanish nautiyalView Answer on Stackoverflow
Solution 14 - Ruby on-RailsnhegrojView Answer on Stackoverflow
Solution 15 - Ruby on-RailsSarvar KhalimovView Answer on Stackoverflow
Solution 16 - Ruby on-RailsShanView Answer on Stackoverflow
Solution 17 - Ruby on-RailsAaron HendersonView Answer on Stackoverflow
Solution 18 - Ruby on-RailsRankit RanjanView Answer on Stackoverflow
Solution 19 - Ruby on-RailsAnoob K BavaView Answer on Stackoverflow
Solution 20 - Ruby on-RailsshilovkView Answer on Stackoverflow
Solution 21 - Ruby on-RailsNitin RakeshView Answer on Stackoverflow
Solution 22 - Ruby on-RailsPankaj DhoteView Answer on Stackoverflow
Solution 23 - Ruby on-RailsNicollasView Answer on Stackoverflow
Solution 24 - Ruby on-RailsiamnairView Answer on Stackoverflow