简体   繁体   中英

Is it possible to use Rails rake tasks on secondary databases?

If you are using multiple databases (eg to shard tables across databases) for a given environment is it possible to use the built in Rails rake tasks to manipulate the databases beyond the primary one for said environment?

eg if I use specific connection details for a set of models, can I use rake db:create to create said database?

If so, how?

I've actually overwritten the built-in Rails rake tasks in order to manipulate a second database. The neat thing is that it totally works with the original rake tasks as well.

This is what I did... credit to Nikolay Sturm , as I based my rake task off of his blog.

I added new database settings in my database.yml, as detailed in the blog I linked.

You also create a base model that has these database settings:

class BaseModel < ActiveRecord::Base
  establish_connection "database_connection_name"
  self.abstract_class = true #you want to make this an abstract class because you don't have a table for this
end

You then have any model that connects to this secondary database inherit from your BaseModel.

In your rake task, you set it up as follows (keep in mind that this is for a Postgres connection.)

namespace :db do
  desc 'create database'
  task create: :environment do
    connection_config = BaseModel.connection_config #rename BaseModel to name of your model
    ActiveRecord::Base.establish_connection connection_config.merge('database => 'postgres') #you don't need this bit if you're not using Postgres
    ActiveRecord::Base.connection.create_database connection_config[:database], connection_config
    ActiveRecord::Base.establish_connection connection_config
  end

  desc 'migrate database'
  task migrate: :environment do
    ActiveRecord::Base.establish_connection BaseModel.connection_config
    ActiveRecord::Migrator.migrate('db/migrate/')
  end

  desc 'drop database'
  task drop: :environment do
    connection_config = BaseModel.connection_config
    ActiveRecord::Base.establish_connection connection_config.merge('database' => 'postgres')
    ActiveRecord::Base.connection.drop_database connection_config[:database]
  end

Now, if you do a rake -T in your project, you should be able to see the your descriptions for the rake tasks instead of the default. When you run them, it will run the db:create, db:migrate, and db:drop for both your default and your secondary database. Hope this helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM