繁体   English   中英

将 Rails 3.1 与多个数据库连接起来

[英]Connecting Rails 3.1 with Multiple Databases

在 ShowNearby,我们一直在进行从 PHP 到 RoR 3.1 的大规模迁移,我们面临着你们中的一些人之前可能已经解决的几个问题。

我们有大量数据,我们决定将我们的数据库分成几个我们可以单独处理的数据库。 例如,我们的账户、地点、日志等被拆分到多个数据库中

我们需要迁移、固定装置、模型,才能玩得很好,到目前为止,它一直很混乱。 我们对解决方案可接受的一些要求:

  • 一个 model 应该与其中一个数据库中的一个表相关。
  • rake db:drop - 应该删除我们在 database.yml 中指定的所有数据库环境
  • rake db:create - 应该创建我们在 database.yml 中指定的所有数据库环境
  • rake db:migrate - 应该运行迁移到各种数据库
  • rake db:test - 应该抓取固定装置并将它们放入各种数据库和测试单元/功能/等

我们正在考虑为每个数据库设置单独的 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 并从它继承,因为连接与类紧密耦合(如hereherehere所述),并且将为每个 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

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

嘿,这篇文章很旧,但我找到了一个适用于 Rails 3.2 的解决方案,可能对其他人有所帮助。 https://stackoverflow.com/a/16542724/1447654

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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