Skip to content

Instantly share code, notes, and snippets.

@zulhfreelancer
Last active June 17, 2024 11:44
Show Gist options
  • Save zulhfreelancer/ea140d8ef9292fa9165e to your computer and use it in GitHub Desktop.
Save zulhfreelancer/ea140d8ef9292fa9165e to your computer and use it in GitHub Desktop.
How to reset PG Database on Heroku (for Rails app)?

It's important to note that running this reset will drop any existing data you have in the application

How to reset PG Database on Heroku?

  • Step 1: heroku restart
  • Step 2: heroku pg:reset DATABASE (no need to change the DATABASE)
  • Step 3: heroku run rake db:migrate
  • Step 4: heroku run rake db:seed (if you have seed)

One liner

heroku restart; heroku pg:reset DATABASE --confirm APP-NAME; heroku run rake db:migrate

Note 1

Heroku doesn't allow users from using rake db:reset, rake db:drop and rake db:create command. They only allow heroku pg:reset and rake db:migrate commands.

More info: https://devcenter.heroku.com/articles/rake

Note 2

If you have more than 1 remote, append --remote [your_remote_name] like this:

heroku run rake db:migrate --remote dev (dev is example remote here)

@jgigault
Copy link

Why not this enhanced "one liner":

heroku restart && heroku pg:reset DATABASE --confirm APP-NAME && heroku run rake db:migrate

Using && instead of ; will stop the chained commands in case of a failure exit status.

Regards.

@KraevRoot
Copy link

KraevRoot commented Jan 15, 2019

heroku restart && heroku pg:reset DATABASE_URL --confirm CHANGE_ME_TO_APP_NAME_ON_HEROKU && heroku run rake db:migrate && heroku run rake db:seed worked for me

@serodriguez68
Copy link

What if you want your app to reset itself?

Imagine you have some type of demo that needs to reset itself once a day.

  1. Install the Database Cleaner Gem and make sure you make it available for the production environment.

  2. Create a lib/tasks/scheduler.rake file that looks similar to this

desc "This task is called by the Heroku scheduler add-on to reset the demo"
task :reset_demo => :environment do
  puts "Cleaning Up The DB..."
  DatabaseCleaner.strategy = :truncation
  DatabaseCleaner.clean
  puts "Seeding the DB again..."
  Rake::Task["db:seed"].invoke
  puts "done!"
end
  1. Commit and do git push heroku master

  2. Add the following ENV variables to your Heroku app to disable the Database Cleaner Safeguards. You can do this by logging into your Heroku account.

DATABASE_CLEANER_ALLOW_PRODUCTION=true
DATABASE_CLEANER_ALLOW_REMOTE_DATABASE_URL=true
  1. Test it by running heroku run rake reset_demo

  2. Use the Heroku Scheduler Add-on to program how often should the rake task be executed.

@florent6001
Copy link

I have the following error :

  • [my app] has no database

but i have a cleardb database for a mysql app

@SamZapata
Copy link

oooh thanks!

@ruvaleev
Copy link

Wow, works perfect! Many thanks!

@iarobinson
Copy link

iarobinson commented May 19, 2020

It's important to note that running this reset will drop any existing data you have in the application.

@RishiHQ
Copy link

RishiHQ commented Jun 24, 2020

Thank you!

@RistoLibera
Copy link

Thank you!

@teevyne
Copy link

teevyne commented Jul 22, 2021

Thank you.
This solution, in addition with some other, helped me solve my issue.
However, I lost some data in the process.
Everything else came out very fine

@Bismarck-GM
Copy link

I've open this like 10 times in the last month. Super useful. Thank you.

@bhgupta01
Copy link

Thank you for putting this together, handy and helpful resource <3

@Laranto-spb
Copy link

Thanks! It works for my demo proposes when data itself is not nessesary.

@agrberg
Copy link

agrberg commented Jul 31, 2023

If you find yourself where you cannot re-run migrations as the code has changed since they were written you can do the following to reload the schema:

  1. heroku pg:reset DATABASE
  2. heroku run rails db:environment:set RAILS_ENV=production
  3. heroku run DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rails db:schema:load
  4. heroku run rails db:seed

Step 2 is honestly new to me but from the limited reading it sets the DB's environment to production so I assume it knows the proper database.yml values to load. Either way it's required before step 3 will run and because it is a mutation operation on a prod env database you have to manually allow it via the ENV var.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment