有效的方式,从第二数据库中的数据?(Efficient way to pull data from

2019-09-03 00:48发布

我们有我们所有的应用程序驻留在主数据库。

但有一个第二数据库(从外部数据源更新),我想能够连接到这样我就可以从中提取数据。 我不需要写什么......只是阅读。

它也只有一个表我是从拉动。

我真的只是需要做的是这样的:

OtherDatabase.articles.where(id > 1000)

仅此而已。

所以,我怎么能对Rails这样做(运行3.2.13)?

Answer 1:

对于简单的情况下,Rails可以支持这种没有任何额外的宝石; 简单地定义在database.yml中的数据库:

other_db:
  adapter: mysql2
  encoding: utf8
  database: other_db
  username: user
  password: passwd
  host: 1.2.3.4
  port: 3306

然后在模型中要使用其他数据库中添加:

class Article < ActiveRecord::Base
  establish_connection(:other_db)
  self.table_name = 'other_db.articles'
end

然后你就可以进行查询:

Article.where("id > 1000")

=)



Answer 2:

首先,我们需要定义外部数据库:

# config/database.yml
external:
  adapter: sqlite3
  database: db/external.sqlite3
  pool: 5
  timeout: 5000

对于这样的事情,我更喜欢使用一个模块,采用数据库连接的服务。

# lib/database.rb
module Database
  def self.using(db, klass=ActiveRecord::Base)
    klass.establish_connection(db.to_sym)
    result = yield if block_given?
    klass.establish_connection(Rails.env.to_sym)
    result
  end
end

通过传递块模块这样我们可以确保我们不流血我们查询到,他们不属于或忘记回复我们的连接的数据库。 此外,我们默认的ActiveRecord :: Base的,使我们可以与任何我们的模型的工作。 然而,如果我们知道,我们只使用一个,想孤立我们的模型的使用,我们可以将它作为副参数。

所得的实现可以是这个样子:

# app/models/user.rb
class User < ActiveRecord::Base
  def read_remote
    Database.using(:external) do
      account = Account.where(active: true)
      account.users
    end
  end
end

现在我们有一个非常干净的块中,我们可以在任何地方,我们喜欢的方式使用,使用任何我们想要的模型块内,始终在extneral数据库上运行。 一旦该块结束时,我们知道我们在我们的原始数据库工作恢复。



Answer 3:

复制粘贴:

对于单主机的情况下,你可以定义为读取从站database.yml的另一个数据库连接:

read_slave:
  adapter: postgresql
  database: read_only_production
  username: user
  password: pass
  host: read_slave_host

该数据库由一个模块,它反映使用该数据库连接的ActiveRecord的类支持:

require 'magic_multi_connections'
module ReadSlave
  establish_connection :read_slave
end

现在,所有预先存在的模型可以通过与ReadSlave ::前缀模型类的read_slave连接访问。

# use the read-only connection
    @user = ReadSlave::User.find(params[:id])

    # write to the master (can't use @user.update_attributes because it would#
    try to write to the read slave)
    User.update(@user.id, :login => "new_login")


文章来源: Efficient way to pull data from second database?