连接Rails 3.1与多个数据库

在ShowNearby中,我们一直在从PHP迁移到RoR 3.1,我们正面临一些可能是你之前解决的一些问题。

我们有大量的数据,我们决定把我们的数据库分成几个数据库,我们可以分别处理。 例如,我们的账户,地点,日志和其他信息被分成几个数据库

我们需要迁移,装置,模型,发挥很好,到目前为止,它已经相当混乱。 我们对于解决scheme的一些要求是可以接受的:

  • 一个模型应该与其中一个数据库中的一个表相关。
  • rake db:drop – 应该删除我们在database.yml中指定的所有数据库env
  • rake db:create – 应该创build我们在database.yml中指定的所有数据库env
  • rake db:migrate – 应该运行迁移到各种数据库
  • 耙db:testing – 应抓住夹具,并将其放入各种数据库和testing单位/function/等

我们正在考虑为每个数据库设置单独的rails项目,并将它们与ActiveResource连接起来,但是我们觉得这样做效率不高。 有没有人处理过类似的问题?

非常感谢!!

对于Wukerplank的回答,你也可以把连接细节像通常一样放在database.yml中,像这样:

log_database_production: adapter: mysql host: other_host username: logmein password: supersecret database: logs 

然后在你的特殊模型中:

 class AccessLog < ActiveRecord::Base establish_connection "log_database_#{Rails.env}".to_sym end 

保持那些讨厌的凭据在您的应用程序代码。

编辑:如果你想在多个模型中重用这个连接,你应该创build一个新的抽象类并inheritance它,因为连接与类紧密耦合( 这里和这里解释的),并且将创build新的连接每class。

如果是这样,请设置如下:

 class LogDatabase < ActiveRecord::Base self.abstract_class = true establish_connection "log_database_#{Rails.env}".to_sym end class AccessLog < LogDatabase end class CheckoutLog < LogDatabase end 

连接到不同的数据库是很容易的:

 # model in the "default" database from database.yml class Person < ActiveRecord::Base # ... your stuff here end # model in a different database class Place < ActiveRecord::Base establish_connection ( :adapter => "mysql", :host => "other_host", :username => "username", :password => "password", :database => "other_db" ) end 

我会警惕设置多个Rails项目,因为你会为你的控制器的数据检索增加很多的开销,这可能会让事情变得缓慢。

至于你的移民,装置,模型等问题:我不认为会有一个简单的方法,所以请发表单独的问题,并尽可能具体。

将数据库合并为一个不是一个选项? 这会让你的生活变得更容易!

find一个伟大的职位,将指向其他人正确的方式做这个检查http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html

设置它是这样的:

database.yml(dbconfiguration文件)

 support_development: adapter: blah database: blah username: blah password: blah 

support_base.rb(模型文件)

 class SupportBase < ActiveRecord::Base self.abstract_class = true #important! establish_connection("support_development") end 

tst_test.rb(模型文件)

 class TstTest < SupportBase #SupportBase not ActiveRecord is important! self.table_name = 'tst_test' def self.get_test_name(id) if id = nil return '' else query = "select tst_name from tst_test where tst_id = \'#{id}\'" tst = connection.select_all(query) #select_all is important! return tst[0].fetch('tst_name') end end end 

PS,这实际上不包括迁移,我不认为你可以用耙子在多个数据库上进行迁移(虽然我不确定这是一个难以做到的事,但也可以)。 这只是连接和查询其他不受控制的数据库的好方法。

您可能还想追加Rails环境,所以您的开发和testing数据库是不一样的。

 establish_connection "legacy_#{Rails.env}" 

以下文章build议定义新的Rake任务以实现针对多个数据库的迁移。 每个任务都build立自己的连接,然后使用此连接和特定的数据库文件夹执行迁移。

它还定义了一个熟悉的db:migrate来调用另外两个任务。

包括这里incse链接变得不可用:

 desc "Migrate the database through scripts in db/migrate directory." namespace :db do task :migrate do Rake::Task["db:migrate_db1"].invoke Rake::Task["db:migrate_db2"].invoke end task :migrate_db1 do ActiveRecord::Base.establish_connection DB1_CONF ActiveRecord::Migrator.migrate("db/migrate/db1/") end task :migrate_db2 do ActiveRecord::Base.establish_connection DB2_CONF ActiveRecord::Migrator.migrate("db/migrate/db2/") end end 

来源: Ruby on Rails连接到多个数据库和迁移

嘿这篇文章是旧的,但我已经find了一个解决scheme工作在Rails 3.2可能会帮助别人。 https://stackoverflow.com/a/16542724/1447654