Purge or recreate a Ruby on Rails database

Ruby on-RailsRuby on-Rails-3Rake

Ruby on-Rails Problem Overview


I have a dev Ruby on Rails database full of data. I want to delete everything and rebuild the database. I'm thinking of using something like:

rake db:recreate

Is this possible?

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

I know two ways to do this:

This will reset your database and reload your current schema with all:

rake db:reset db:migrate

This will destroy your db and then create it and then migrate your current schema:

rake db:drop db:create db:migrate

All data will be lost in both scenarios.

Solution 2 - Ruby on-Rails

On Rails 4, all needed is

$ rake db:schema:load

That would delete the entire contents on your DB and recreate the schema from your schema.rb file, without having to apply all migrations one by one.

Solution 3 - Ruby on-Rails

I use the following one liner in Terminal.

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

I put this as a shell alias and named it remigrate

By now, you can easily "chain" Rails tasks:

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+

Solution 4 - Ruby on-Rails

Update: In Rails 5, this command will be accessible through this command:

rails db:purge db:create db:migrate RAILS_ENV=test


As of the newest rails 4.2 release you can now run:

rake db:purge 

Source: commit

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
  task :purge => [:load_config] do
    ActiveRecord::Tasks::DatabaseTasks.purge_current
  end

It can be used together like mentioned above:

rake db:purge db:create db:migrate RAILS_ENV=test

Solution 5 - Ruby on-Rails

Depending on what you're wanting, you can use…

rake db:create

…to build the database from scratch from config/database.yml, or…

rake db:schema:load

…to build the database from scratch from your schema.rb file.

Solution 6 - Ruby on-Rails

From the command line run

rake db:migrate:reset

Solution 7 - Ruby on-Rails

Use like

rake db:drop db:create db:migrate db:seed

All in one line. This is faster since the environment doesn't get reloaded again and again.

db:drop - will drop database.

db:create - will create database (host/db/password will be taken from config/database.yml)

db:migrate - will run existing migrations from directory (db/migration/.rb)*.

db:seed - will run seed data possible from directory (db/migration/seed.rb)..

I usually prefer:

rake db:reset

to do all at once.

Cheers!

Solution 8 - Ruby on-Rails

In Rails 6 there is a convenient way for resetting DB and planting seeds again:

rails db:seed:replant # Truncates tables of each database for current environment and loads the seeds

https://weblog.rubyonrails.org/2019/3/15/this-week-in-rails-security-fixes-bulk-insert-and-upsert-seeds-replanting/

Solution 9 - Ruby on-Rails

Just issue the sequence of the steps: drop the database, then re-create it again, migrate data, and if you have seeds, sow the database:

rake db:drop db:create db:migrate db:seed

Since the default environment for rake is development, in case if you see the exception in spec tests, you should re-create db for the test environment as follows:

RAILS_ENV=test rake db:drop db:create db:migrate

In most cases the test database is being sowed during the test procedures, so db:seed task action isn't required to be passed. Otherwise, you shall to prepare the database:

rake db:test:prepare

or

RAILS_ENV=test rake db:seed

Additionally, to use the recreate task you can add into Rakefile the following code:

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end

Then issue:

rake db:recreate

Solution 10 - Ruby on-Rails

You can manually do:

rake db:drop
rake db:create
rake db:migrate

Or just rake db:reset, which will run the above steps but will also run your db/seeds.rb file.

An added nuance is that rake db:reset loads directly from your schema.rb file as opposed to running all the migrations files again.

You data gets blown away in all cases.

Solution 11 - Ruby on-Rails

You can use this following command line:

rake db:drop db:create db:migrate db:seed db:test:clone

Solution 12 - Ruby on-Rails

To drop a particular database, you can do this on rails console:

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

And then migrate DB again

$bundle exec rake db:migrate 

Solution 13 - Ruby on-Rails

On rails 4.2, to remove all data but preserve the database

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md

Solution 14 - Ruby on-Rails

You can use db:reset - for run db:drop and db:setup or db:migrate:reset - which runs db:drop, db:create and db:migrate.

dependent at you want to use exist schema.rb

Solution 15 - Ruby on-Rails

According to Rails guide, this one liner should be used because it would load from the schema.rb instead of reloading the migration files one by one:

rake db:reset

Solution 16 - Ruby on-Rails

Because in development , you will always want to recreate the database,you can define a rake task in your lib/tasks folder like that.

  namespace :db do
      task :all => [:environment, :drop, :create, :migrate] do
   end 
end

and in terminal you will run

rake db:all

it will rebuild your database

Solution 17 - Ruby on-Rails

I think the best way to run this command:

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed

Solution 18 - Ruby on-Rails

Simply you can run

rake db:setup

It will drop database, create new database and populate db from seed if you created seed file with some data.

Solution 19 - Ruby on-Rails

3 options, same result:

1. All steps:

  $ rake db:drop           # deletes the database for the current env
  $ rake db:create         # creates the database for the current env
  $ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
  $ rake db:seed           # seed with initial data

2. Reset:

  $ rake db:reset          # drop / schema:load / seed

3. Migrate:reset:

  $ rake db:migrate:reset  # drop / create / migrate
  $ rake db:seed

Notes:

  • If schema:load is used is faster than doing all migrations, but same result.
  • All data will be lost.
  • You can run multiple rakes in one line.
  • Works with rails 3.

Solution 20 - Ruby on-Rails

I've today made quite a few changes to my rails schema. I realised I needed an additional two models in a hierarchy and some others to be deleted. There were many little changes required to the models and controllers.

I added the two new models and created them, using:

rake db:migrate

Then I edited the schema.rb file. I manually removed the old models that were no longer required, changed the foreign key field as required and just reordered it a bit to make it clearer to me. I deleted all the migrations, and then re-ran the build via:

rake db:reset

It worked perfectly. All the data has to be reloaded, of course. Rails realised the migrations had been deleted and reset the high-water mark:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])

Solution 21 - Ruby on-Rails

I use:

  • rails db:drop to delete the databases.
  • rails db:create to create the databases based on config/database.yml

The previous commands may be replaced with rails db:reset.

Don't forget to run rails db:migrate to run the migrations.

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
QuestionAnApprenticeView Question on Stackoverflow
Solution 1 - Ruby on-RailsthenengahView Answer on Stackoverflow
Solution 2 - Ruby on-RailsEneko AlonsoView Answer on Stackoverflow
Solution 3 - Ruby on-RailsTK.View Answer on Stackoverflow
Solution 4 - Ruby on-RailsRobbie GuilfoyleView Answer on Stackoverflow
Solution 5 - Ruby on-RailscoreywardView Answer on Stackoverflow
Solution 6 - Ruby on-Railsuser2747051View Answer on Stackoverflow
Solution 7 - Ruby on-RailsManish ShrivastavaView Answer on Stackoverflow
Solution 8 - Ruby on-RailsMario Pérez AlarcónView Answer on Stackoverflow
Solution 9 - Ruby on-RailsМалъ СкрылевъView Answer on Stackoverflow
Solution 10 - Ruby on-RailsErik TrautmanView Answer on Stackoverflow
Solution 11 - Ruby on-Railsuser1358180View Answer on Stackoverflow
Solution 12 - Ruby on-RailsKushView Answer on Stackoverflow
Solution 13 - Ruby on-RailsYana Agun SiswantoView Answer on Stackoverflow
Solution 14 - Ruby on-RailsAleksandr BabakView Answer on Stackoverflow
Solution 15 - Ruby on-RailsVictorView Answer on Stackoverflow
Solution 16 - Ruby on-RailsObed LorissonView Answer on Stackoverflow
Solution 17 - Ruby on-RailsThorinView Answer on Stackoverflow
Solution 18 - Ruby on-RailsTouseef MurtazaView Answer on Stackoverflow
Solution 19 - Ruby on-RailsurkoView Answer on Stackoverflow
Solution 20 - Ruby on-Railsport5432View Answer on Stackoverflow
Solution 21 - Ruby on-Railsdavidauza.engineerView Answer on Stackoverflow