使用不同模式的多个数据库的Rake任务

时间:2011-02-23 02:20:02

标签: ruby-on-rails rake-task

我正在开发一个多数据库Rails 3应用程序。每个数据库都有不同的模式(并且在生产中位于不同的位置)。我已经将应用程序设置为与不同的数据库通信,如下所示:

的database.yml

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: main_development
  pool: 5
  username: someuser
  password: somepassword
  socket: /tmp/mysql.sock

other_development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: other_development
  pool: 5
  username: someuser
  password: somepassword
  socket: /tmp/mysql.sock

模型/ other_base.rb

class OtherBase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "other_#{Rails.env}"
end

模型/ some_model.rb

class SomeModel < OtherBase
  # Regular stuff here
end

现在,这适用于Web应用程序,但不太适合运行rake任务,包括测试(夹具未正确加载)。有没有可用的宝石?任何帮助表示赞赏。

此外,创建一个可以处理不同数据库的不同模式的schema.rb文件会很好 - 也就是说,允许我执行rake db:create或db:setup之类的操作并让它创建多个数据库使用特定于数据库的架构。

4 个答案:

答案 0 :(得分:3)

在这种情况下,我发现环境的使用是不可接受的黑客。您希望在同一环境中拥有两个数据库。

当我自己研究这个问题时,我遇到了github用户rafaelchiti的要点。不幸的是,他删除了原来的要点。你可以找到copy of it here

答案 1 :(得分:1)

我遇到了同样的问题,在花了半个小时寻找'loopy_multiple_database'插件之后,最终得出结论说它已经消失在网络面前并诉诸monkey-patching the Rails rake tasks。我想解决的唯一任务是db:migrate,但同样(丑陋)的过程也可以修补其他任务。

在Rails 3上,在db_migrate_override.rake中添加创建文件lib/tasks(任何* .rake名称都可以),如下所示:

Rake::TaskManager.class_eval do
  def remove_task(task_name)
    @tasks.delete(task_name.to_s)
  end
end

def remove_task(task_name)
  Rake.application.remove_task(task_name)
end

namespace :db do
  remove_task 'db:migrate'
  desc "Migrate the database (options: VERSION=x, SRCDIR=path, VERBOSE=false)."
  task :migrate => :environment do
    srcdir = (ENV["SRCDIR"] || "db/migrate/")
    ActiveRecord::Migrator.migrate(srcdir, ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
    Rake::Task["db:schema:dump"].invoke if (ActiveRecord::Base.schema_format == :ruby && ENV['SRCDIR'].nil?)
  end
end

然后你可以运行

rake db:migrate RAILS_ENV=other_development SRCDIR=db_other/migrate

答案 2 :(得分:1)

您可以尝试使用章鱼gem(https://github.com/thiagopradi/octopus),它可以帮助您设置多个数据库,并与Rails 3.2和Rails 4兼容。 使用此gem,您可以轻松指定要为其运行迁移的数据库。

答案 3 :(得分:0)

您可以尝试使用loopy multiple databases插件。它似乎允许轻松指定不同的rake配置