如何在Heroku中为一个rails 3.1应用程序使用多个数据库? [英] How to use multiple databases for one rails 3.1 app in Heroku?

查看:111
本文介绍了如何在Heroku中为一个rails 3.1应用程序使用多个数据库?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

My Rails 3.1应用程序连接到2个数据库,其中一个是默认的,另一个是Amazon RDS MYSQL实例。

当前的database.yml包含两个生产数据库连接。需要从第二个数据库中提取的模型只需使用

  establish_connectionproduction_on_amazon

不幸的是Heroku覆盖了你的database.yml,而且似乎只包含一个数据库连接。有人知道我可以如何添加或配置我的第二个?



运行heroku配置我可以看到有2个数据库的列表,但似乎不能配置为连接到两者。也许不知何故,我的默认设置为Heroku上的SHARED_DATABASE_URL分贝,并将备用设置为指向Amazon的DATABASE_URL ...

关于尼尔的回答,这里有一个办法。不是开箱即用的解决方案,但可能会给你一个想法...
/lib/active_record_extensions.rb

  module ActiveRecordExtensions 
class Shard< ActiveRecord :: Base
#需要从heroku config切换到分片数据库连接
primary_database_url = ENV ['PRIMARY_DATABASE_URL']

if(!primary_database_url.nil?)
parsed_connection_string = primary_database_url.split(://)
adapter = parsed_connection_string [0]
parsed_connection_string = parsed_connection_string [1] .split(:)
username = parsed_connection_string [0 ]
parsed_connection_string = parsed_connection_string [1] .split(@)
password = parsed_connection_string [0]
parsed_connection_string = parsed_connection_string [1] .split(/)
host = parsed_connection_string [0]
database = parsed_connection_string [1]

establish_connection(
:adapter =>适配器,
:host =>主机,
:username =>用户名,
:password =>密码,
:database =>数据库,
: port => 3306,
:pool => 5,
:timeout => 5000

else
self.establish_connectionshard _#{Rails.env}
end
end

class ShardMigration< ActiveRecord :: Migration
def connection
ActiveRecord :: Shard.connection
end
end
end

所以你的模型应该扩展ActiveRecord :: Shard而不是Base


My Rails 3.1 application connects to 2 databases, one is the default, the other is an Amazon RDS MYSQL instance.

The current database.yml contains two production database connections. The models that need to pull from the second database simply use

establish_connection "production_on_amazon"

Unfortunately Heroku overwrites your database.yml, and only seems to inlcude one database connection. Does anyone know how I can add or configure my second?

Running "heroku config" I can see there are 2 DB's listed but cant seem to configure to connect to both. Perhaps somehow set my default to the SHARED_DATABASE_URL db on Heroku and set the alternate to the DATABASE_URL which points to Amazon...

解决方案

Regarding Neil's answer, here is a way to do it. Not an out-of-box solution, but might give you an idea... /lib/active_record_extensions.rb

module ActiveRecordExtensions
  class Shard < ActiveRecord::Base
    #need to switch to the shard database connection from heroku config 
    primary_database_url = ENV['PRIMARY_DATABASE_URL']

    if(!primary_database_url.nil?)
      parsed_connection_string = primary_database_url.split("://")
      adapter = parsed_connection_string[0]
      parsed_connection_string = parsed_connection_string[1].split(":")
      username = parsed_connection_string[0]
      parsed_connection_string = parsed_connection_string[1].split("@")
      password = parsed_connection_string[0]
      parsed_connection_string = parsed_connection_string[1].split("/")  
      host = parsed_connection_string[0]
      database = parsed_connection_string[1]

      establish_connection(
        :adapter  => adapter,
        :host     => host,
        :username => username,
        :password => password,
        :database => database,
        :port     => 3306,
        :pool     => 5,
        :timeout  => 5000
      )
    else
      self.establish_connection "shard_#{Rails.env}"
    end
  end

  class ShardMigration < ActiveRecord::Migration
    def connection
      ActiveRecord::Shard.connection 
    end
  end
end

So your model should just extend ActiveRecord::Shard instead of Base

这篇关于如何在Heroku中为一个rails 3.1应用程序使用多个数据库?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆