Apartment gem, tenant databases and MySQL
Oh, the fun it is.
I'm working on an application that will use the apartment gem and I've been needing to drop and recreate the database. I still prefer to work with MySQL and haven't jumped ship to the popular Postgres. MySQL doesn't seem to have as much support for the Apartment gem that Postgres does.
The out of the box functionality for running rails db:reset
will simply drop and recreate your development and test environment databases and not touch any Apartment generated tenant databases that may have been created while developing and testing.
I decided to create a rake task since I've found myself dropping the tenant database plenty of times over.
Create a file in lib/tasks
, I named it drop_tenants.rake
.
Within the rake file add:
namespace :apartment do
desc 'drop current tenants before performing database reset'
task :drop_tenants => :environment do
c = Mysql2::Client.new(host: "localhost", username: "root", password: "password")
tenant_dbs = User.pluck :subdomain
tenant_dbs.each do |db|
r = c.query("DROP DATABASE #{db};")
puts "Dropped #{db}"
end
end
end
This will get you the command rake apartment:drop_tenants
so you can prepend this to when you run rake db:reset
you'll simply just run rake apartment:drop_tenants db:reset
and you're good to go!