将Rails 3.1与多个数据库连接



在ShowNear,我们一直在从PHP向RoR 3.1进行大规模迁移,我们面临着一些问题,这些问题可能是你们中的一些人以前解决过的。

我们有大量的数据,我们决定将数据库分离为几个可以单独处理的数据库。例如,我们的账户、地点、日志和其他信息被拆分为几个数据库

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

  • 一个模型应该与其中一个数据库中的一个表相关
  • rakedb:drop-应该删除我们在database.yml中指定的所有数据库环境
  • rakedb:create-应该创建我们在database.yml中指定的所有数据库环境
  • rakedb:migrate-应该运行到各种数据库的迁移
  • rakedb:test-应该抓取fixture并将其放入各种数据库和测试单元/函数等中

我们正在考虑为每个数据库设置单独的rails项目,并将它们与ActiveResource连接,但我们觉得这不是很有效。你们中有人以前处理过类似的问题吗?

对于Wukerplatk的答案,您也可以像往常一样将连接详细信息放在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

为了防止那些烦人的凭据出现在您的应用程序代码中。

编辑:如果你想在多个模型中重用这个连接,你应该创建一个新的抽象类并从中继承,因为连接与类紧密耦合(如这里、这里和这里所解释的),并且会为每个类创建新的连接。

如果是这样的话,设置如下:

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(模型文件)

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,这真的不包括迁移,我不认为你可以用rake在多个数据库上进行迁移(尽管我不确定这是一个很难做到的"不能做",但这可能是可能的)。这只是连接和查询其他您无法控制的数据库的一个很好的方法。

您可能还想附加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

来源:RubyonRails连接到多个数据库和迁移

嘿,这篇文章很旧,但我发现了一个在Rails3.2上运行的解决方案,它可能会帮助其他人。https://stackoverflow.com/a/16542724/1447654

相关内容

  • 没有找到相关文章

最新更新