Connecting Rails 3.1 with Multiple Databases
在ShowNearby,我们一直在从PHP迁移到RoR 3.1,我们面临着一些问题,可能是你们之前已经解决过的问题。
我们有大量数据,我们决定将数据库分成几个可以单独处理的数据库。例如,我们的帐户,地点,日志和其他帐户被拆分为多个数据库
我们需要让迁移,固定装置,模型,以及良好的发挥,到目前为止它已经相当混乱。我们对解决方案的一些要求是可以接受的:
- 一个模型应该与一个数据库中的一个表相关。
- rake db:drop - 应该删除我们在database.yml中指定的所有数据库env
- rake db:create - 应该创建我们在database.yml中指定的所有数据库环境
- rake db:migrate - 应该运行迁移到各种数据库
- rake db:test - 应该抓住fixture并将它们放入各种数据库和测试单元/功能/等
我们正在考虑为每个数据库设置单独的rails项目并将它们与ActiveResource连接,但我们认为这不是非常有效。你们之前有没有遇到过类似的问题?
非常感谢!!
对于Wukerplank的回答,您还可以像往常一样将连接详细信息放在database.yml中,其名称如下:
1 2 3 4 5 6 | log_database_production: adapter: mysql host: other_host username: logmein password: supersecret database: logs |
然后在你的特殊模型中:
1 2 3 | class AccessLog < ActiveRecord::Base establish_connection"log_database_#{Rails.env}".to_sym end |
保持那些讨厌的凭据不在您的应用程序代码中。
编辑:如果要在多个模型中重用此连接,则应创建一个新的抽象类并从中继承,因为连接与类紧密耦合(如此处,此处和此处所述),并且将创建新的连接每节课。
如果是这种情况,请设置如下:
1 2 3 4 5 6 7 8 9 10 | 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 |
连接到不同的数据库非常简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 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项目,因为你会为控制器的数据检索增加很多开销,这可能会让事情变得缓慢。
至于你关于迁移,固定装置,模型等的问题:我不认为会有一个简单的方法,所以请发布单独的问题并尽可能具体。
将DB合并为一个不是一个选项?它会让你的生活更轻松!
找到一篇很棒的文章,指出其他人正确的方式来做这个检查http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html
设置如下:
database.yml(db配置文件)
1 2 3 4 5 | support_development: adapter: blah database: blah username: blah password: blah |
support_base.rb(模型文件)
1 2 3 4 | class SupportBase < ActiveRecord::Base self.abstract_class = true #important! establish_connection("support_development") end |
tst_test.rb(模型文件)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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,这真的不包括迁移,我不认为你可以使用rake在多个DB上进行迁移(虽然我不确定那是一个很难'不能做',但这可能是可能的)。这只是连接和查询您无法控制的其他DB的好方法。
您可能还想附加Rails环境,因此您的开发和测试数据库不一样。
1 | establish_connection"legacy_#{Rails.env}" |
以下文章建议定义新的Rake任务以实现针对多个数据库的迁移。每个任务都建立自己的连接,然后使用此连接和特定数据库文件夹执行迁移。
它还定义了一个熟悉的
包括此处链接变得不可用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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连接到多个数据库和迁移
嘿这篇文章已经过时了,但我找到了一个可以帮助其他人的Rails 3.2解决方案。
https://stackoverflow.com/a/16542724/1447654