Rails 开发 website 连接外部数据库 (多个数据库) 配置

jasonZYJ · 2014年02月13日 · 最后由 pynix 回复于 2014年02月14日 · 4137 次阅读

1.增加 external_database.yml 在 project/config,配置如下 (以连接 postgresql 为例):

development:
  adapter: postgresql
  database: DataBase_DEV
  encoding: utf8
  pool: 15
  timeout: 5000
  username: yourname
  password: yourpassword
  host: localhost

production:
  adapter: postgresql
  database: DataBase_PROD
  encoding: utf8
  pool: 15
  timeout: 5000
  username: yourname
  password: yourpassword
  host: remote ip address

2.增加 external_databases.rb 文件在 project/config/initializers,内容如下 (初始化外部数据库的各个参数):

EXTERNAL_DATABASE = YAML.load_file("#{Rails.root}/config/external_database.yml")[Rails.env]

3.增加 external_db_object.rb 文件在 projrct/app/models/,内容如下(建立外部数据库连接):

class ExternalDbObject < ActiveRecord::Base
  self.abstract_class = true
  begin
    if %w[production development test].include? Rails.env
      establish_connection(
          :adapter => EXTERNAL_DATABASE ["adapter"],
          :pool => EXTERNAL_DATABASE ["pool"],
          :timeout => EXTERNAL_DATABASE ["timeout"],
          :host => EXTERNAL_DATABASE ["host"],
          :database => EXTERNAL_DATABASE ["database"],
          :username => EXTERNAL_DATABASE ["username"],
          :password => EXTERNAL_DATABASE ["password"],
          :encoding => EXTERNAL_DATABASE ["encoding"])
    end
  rescue Exception => e
    Rails.logger.error("Failed to connect to #{EXTERNAL_DATABASE ["adapter"]}")
    Rails.logger.error(e.message)
    Rails.logger.error(e.backtrace.join("\n"))
  end
end

4.此上三部已设置好外部数据库的连接信息,此时如果要用外部数据库的某个表(例如 sample_cars)建立 model:

class Car < ExternalDbObject (注意此时要继承ExternalDbObject  而不是ActiveRecord::Base
  self.table_name = "sample_cars"
end

至此完成了外部数据库的连接,指定了 sample_cars 表作为 Car model 对应的表,此时表中各个字段均可为此 model 所用,包括 find 各方法; 如果用到多张表(每个都继承 ExternalDbObject),而且表间有关联,只需要添加关联,association 关系完全适用

这头像是要给黑莓做代言么... 😄 😄 😄

我曾经也超喜欢...

#4 楼 @joseen 现在 ios 与安卓真心腻了,都给女友用了,用用黑莓自己折腾系统的感觉就是爽啊,哈

外部数据库问题多多,关联太紧密。用 JSON 交换信息靠谱很多。

#6 楼 @billy 这个倒是没有用过,怎么用 JSON 实现交换信息呢?

@zyjloveher 外部的数据库顾名思义肯定会有一个外部的 App 来操作它,不管是 Rails, PHP 还是其他。然后你这边又有一个 Rails app 来操作数据库。那谁来对数据负责呢?谁来保证一致性呢?用 JSON 其实就是 API 啦,这边 Rails 发一个请求到外部的 App, 然后外部 App 负责回复和操作数据。请求可以通过内部端口比如 localhost:3001, 并阻止外来请求。

可以换下组织形式,更好理解

database.yml

development:
  xxxxx

a_development:
  xxxxx

b_development:
  xxxxx
...
a_production:
  xxxxx

config/initializers/multi_database.rb 默认就是连接 development/production

class FirstDB < ActiveRecord::Base
  self.abstract_class = true
end

class SecondDB < ActiveRecord::Base
  self.abstract_class = true
  establish_connection("a_#{Rails.env}")
end

class ThirdDB < ActiveRecord::Base
  self.abstract_class = true
  establish_connection("b_#{Rails.env}")
end

model 中继承各自数据库

app/models/a.rb
class A < FirstDB; end

app/models/b.rb
class B < SecondDB; end

#9 楼 @diudiutang 嗯,简洁一目了然

#8 楼 @billy 是的,这个做的时候考虑到这个因素,受教

@zyjloveher 不敢当,一点看法而已。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号