Rake task to truncate all tables in Rails 3 Rake task to truncate all tables in Rails 3 postgresql postgresql

Rake task to truncate all tables in Rails 3


I've found this via google, and then I got a much simpler solution than the one approved, so here it is: Use the database_cleaner gem. Here're the steps.

In your Gemfile (execute bundle after modifying):

gem 'database_cleaner' # you might want to limit this to the dev and staging group

With that gem in place, the statement DatabaseCleaner.clean_with :truncation will truncate the database. Adding it to a rake task is trivial:

# tasks/db/clean.rakenamespace :db do  desc "Truncate all existing data"  task :truncate => "db:load_config" do    DatabaseCleaner.clean_with :truncation  endend

That's it. You can also use the DatabaseCleaner.clean_with :truncation line inside your db/seeds.rb file directly so that you don't forget to truncate the database before seeding.


So I edited the linked example into this:

namespace :db do  desc "Truncate all existing data"  task :truncate => "db:load_config" do   begin    config = ActiveRecord::Base.configurations[::Rails.env]    ActiveRecord::Base.establish_connection    case config["adapter"]      when "mysql", "postgresql"        ActiveRecord::Base.connection.tables.each do |table|          ActiveRecord::Base.connection.execute("TRUNCATE #{table}")        end      when "sqlite", "sqlite3"        ActiveRecord::Base.connection.tables.each do |table|          ActiveRecord::Base.connection.execute("DELETE FROM #{table}")          ActiveRecord::Base.connection.execute("DELETE FROM sqlite_sequence where name='#{table}'")        end                                                                                                                                      ActiveRecord::Base.connection.execute("VACUUM")     end    end  endend

This example is based on Chris Ledet's code bellow (thanks) and works with Rails 3.X.

Thanks for all hints.


According to Chris Ledet answer, this becomes much simpler:

ActiveRecord::Base.connection.tables.each do |table|    ActiveRecord::Base.connection.execute("TRUNCATE TABLE #{table};")end