Ruby/ActiveRecord fastest way to truncate test database

Tried a few strategies, but this seems to be the fastest:
DatabaseCleaner truncate_all: 0.8s
This: 0.2s

# fast truncation of all tables that need truncations (select is 10x faster then truncate)
# https://grosser.it/2012/07/03/rubyactiverecord-fastest-way-to-truncate-test-database/
def truncate_all_tables
  config = ActiveRecord::Base.configurations[::Rails.env]
  connection = ActiveRecord::Base.connection
  connection.disable_referential_integrity do
    connection.tables.each do |table_name|
      next if connection.select_value("SELECT count(*) FROM #{table_name}") == 0
      case config["adapter"]
      when "mysql", "mysql2", "postgresql"
        connection.execute("TRUNCATE #{table_name}")
      when "sqlite", "sqlite3"
        connection.execute("DELETE FROM #{table_name}")
        connection.execute("DELETE FROM sqlite_sequence where name='#{table_name}'")
      end
    end
    connection.execute("VACUUM") if config["adapter"] == "sqlite3"
  end
end

3 thoughts on “Ruby/ActiveRecord fastest way to truncate test database

  1. This should fix it:


    def truncate_all_tables
    config = ActiveRecord::Base.configurations[::Rails.env]
    connection = ActiveRecord::Base.connection
    connection.disable_referential_integrity do
    connection.tables.each do |table_name|
    next if connection.select_value("SELECT count(*) FROM #{table_name}") == 0
    case config["adapter"]
    when "mysql", "mysql2", "postgresql"
    connection.execute("TRUNCATE #{table_name}")
    when "sqlite", "sqlite3"
    connection.execute("DELETE FROM #{table_name}")
    connection.execute("DELETE FROM sqlite_sequence where name='#{table_name}'")
    end
    end
    connection.execute("VACUUM") if config["adapter"] == "sqlite3"
    end
    end

    view raw

    gistfile1.rb

    hosted with ❤ by GitHub

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s