diff --git a/README.mkdn b/README.mkdn index dbc7be1c..cd3ccef2 100644 --- a/README.mkdn +++ b/README.mkdn @@ -158,6 +158,18 @@ Then you can use the `SHARD` environment variable to override the `master_shard` SHARD=shard1 rake db:setup && SHARD=shard2 rake db:setup ``` +For creating specific shard DB use: + +```bash +SHARD=shard1 rake db:shards:create +``` + +For droping specific shard DB use: + +```bash +SHARD=shard1 rake db:shards:drop +``` + ### Rails Controllers If you want to send a specified action, or all actions from a controller, to a specific shard, use this syntax: diff --git a/lib/tasks/shards_db.rake b/lib/tasks/shards_db.rake new file mode 100644 index 00000000..c5e8d324 --- /dev/null +++ b/lib/tasks/shards_db.rake @@ -0,0 +1,38 @@ +namespace :db do + namespace :shards do + desc 'Create shard DB' + task create: :load_config do + include ActiveRecord::Tasks + + shard = ENV['SHARD'] + rails_env = ENV['RAILS_ENV'] || "development" + + DatabaseTasks.database_configuration = Octopus.config[rails_env][rails_env] + + if shard + DatabaseTasks.create(DatabaseTasks.database_configuration[shard]) unless DatabaseTasks.database_configuration[shard].nil? + else + DatabaseTasks.database_configuration.each do |_, value| + DatabaseTasks.create(value) + end + end + end + + desc 'Drop shard DB' + task drop: :load_config do + include ActiveRecord::Tasks + + shard = ENV['SHARD'] + rails_env = ENV['RAILS_ENV'] || "development" + + DatabaseTasks.database_configuration = Octopus.config[rails_env][rails_env] + + if shard + DatabaseTasks.drop(DatabaseTasks.database_configuration[shard]) unless DatabaseTasks.database_configuration[shard].nil? + else + DatabaseTasks.database_configuration.each do |_, value| + DatabaseTasks.drop(value) + end + end + end + end