[英]Connecting Rails 3.1 with Multiple Databases
在 ShowNearby,我们一直在进行从 PHP 到 RoR 3.1 的大规模迁移,我们面临着你们中的一些人之前可能已经解决的几个问题。
我们有大量数据,我们决定将我们的数据库分成几个我们可以单独处理的数据库。 例如,我们的账户、地点、日志等被拆分到多个数据库中
我们需要迁移、固定装置、模型,才能玩得很好,到目前为止,它一直很混乱。 我们对解决方案可接受的一些要求:
我们正在考虑为每个数据库设置单独的 Rails 项目并将它们与 ActiveResource 连接,但我们认为这不是很有效。 你们中有人处理过类似的问题吗?
对于 Wukerplank 的回答,您还可以像往常一样将连接详细信息放在 database.yml 中,名称如下:
log_database_production:
adapter: mysql
host: other_host
username: logmein
password: supersecret
database: logs
然后在您的特殊 model 中:
class AccessLog < ActiveRecord::Base
establish_connection "log_database_#{Rails.env}".to_sym
end
防止那些讨厌的凭据出现在您的应用程序代码中。
编辑:如果你想在多个模型中重用这个连接,你应该创建一个新的抽象 class 并从它继承,因为连接与类紧密耦合(如here 、 here和here所述),并且将为每个 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 项目,因为您将为控制器的数据检索增加大量开销,这可能会使事情变慢。
至于您关于迁移、固定装置、模型等的问题:我认为不会有简单的方法,所以请发布单独的问题并尽可能具体。
将数据库合并为一个不是一种选择? 它会让你的生活更轻松!
找到了一篇很棒的帖子,可以为其他人指出正确的做法,请查看http://blog.bitmelt.com/2008/10/connecting-to-multiple-database-in-ruby.html
设置如下:
database.yml(数据库配置文件)
support_development:
adapter: blah
database: blah
username: blah
password: blah
support_base.rb(model 文件)
class SupportBase < ActiveRecord::Base
self.abstract_class = true #important!
establish_connection("support_development")
end
tst_test.rb(一个 model 文件)
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 在多个数据库上进行迁移(尽管我不确定这是一个很难的“不能做”,但它可能是可能的)。 这只是连接和查询您无法控制的其他数据库的好方法。
你可能还想append的Rails环境,这样你的开发和测试数据库就不一样了。
establish_connection "legacy_#{Rails.env}"
以下文章建议定义新的 Rake 任务以实现针对多个数据库的迁移。 每个任务都建立自己的连接,然后使用此连接和特定的数据库文件夹执行迁移。
它还定义了一个熟悉的db:migrate
来调用另外两个任务。
包括此处以防链接不可用:
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
嘿,这篇文章很旧,但我找到了一个适用于 Rails 3.2 的解决方案,可能对其他人有所帮助。 https://stackoverflow.com/a/16542724/1447654
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.