Mysql 如何在Heroku中为一个rails 3.1应用程序使用多个数据库?

Mysql 如何在Heroku中为一个rails 3.1应用程序使用多个数据库?,mysql,ruby-on-rails-3.1,heroku,Mysql,Ruby On Rails 3.1,Heroku,我的Rails 3.1应用程序连接到两个数据库,一个是默认数据库,另一个是Amazon RDS MYSQL实例 当前database.yml包含两个生产数据库连接。需要从第二个数据库中提取的模型只需使用 establish_connection "production_on_amazon" 不幸的是,Heroku覆盖了您的database.yml,并且似乎只包含一个数据库连接。有人知道我如何添加或配置第二个服务器吗 运行“heroku配置”我可以看到列出了2个DB,但似乎无法配置为连接到这两个

我的Rails 3.1应用程序连接到两个数据库,一个是默认数据库,另一个是Amazon RDS MYSQL实例

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

establish_connection "production_on_amazon"
不幸的是,Heroku覆盖了您的database.yml,并且似乎只包含一个数据库连接。有人知道我如何添加或配置第二个服务器吗


运行“heroku配置”我可以看到列出了2个DB,但似乎无法配置为连接到这两个DB。也许我会将我的默认设置为Heroku上的共享数据库URL数据库,并将备用设置为指向Amazon的数据库URL…

Heroku将始终将您的应用程序连接到他们为您创建的生产数据库。如果你想建立一个额外的连接,你需要在你的代码中手动创建一个ENV变量,代码可以用它作为连接字符串


database.yml生产部分中的任何内容都由Heroku合并并替换。

关于Neil的回答,这里有一种方法。不是现成的解决方案,但可能会给你一个想法。。。 /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
模块ActiveRecordExtensions
类Shardadapter,
:host=>host,
:username=>username,
:password=>password,
:database=>database,
:端口=>3306,
:pool=>5,
:超时=>5000
)
其他的
self.building_连接“shard_35;{Rails.env}”
结束
结束
类ShardMigration

因此,您的模型应该只是扩展ActiveRecord::Shard,而不是使用以前的响应,而是将Rails 3的一些优点与配置结合起来,并简化解析

# config/application.rb
module MyApp
  class Application < Rails::Application
    ... other configs

    config.secondary_database_url = ENV['SECONDARY_DB_URL']
  end
end
#config/application.rb
模块MyApp
类应用程序
我们可能希望在开发/测试中覆盖这一点

# config/environments/development.rb

module MyApp
  class Application < Rails::Application
    ... other configs

    config.secondary_database_url = 'SOME_CONNECTION_STRING'
  end
end    
#config/environments/development.rb
模块MyApp
类应用程序
现在要设置类,我们将让模型继承自

# lib/active_record/secondary.rb 
module ActiveRecord
  class Secondary < ActiveRecord::Base
    self.abstract_class = true

    # prior to AR 3.2.1
    url = URI.parse( MyApp::Application.config.secondary_database_url )
    establish_connection(
      :adapter  => 'mysql',
      :host     => url.host,
      :username => url.userinfo.split(':')[0],
      :password => url.userinfo.split(':')[1],
      :database => url.path[1..-1],
      :port     => url.port || 3306
    )

    # as of AR 3.2.1
    establish_connection(MyApp::Application.config.secondary_database_url)

  end

  class SecondaryMigration < ActiveRecord::Migration
    def connection
      ActiveRecord::Secondary.connection 
    end
  end

end
#lib/active_record/secondary.rb
模块活动记录
类辅助“mysql”,
:host=>url.host,
:username=>url.userinfo.split(“:”)[0],
:password=>url.userinfo.split(“:”)[1],
:database=>url.path[1..-1],
:port=>url.port | | 3306
)
#自AR 3.2.1起
建立连接(MyApp::Application.config.secondary\u数据库\u url)
结束
类SecondaryMigration
对于那些想知道如何做到这一点的人来说,我选择的方法是在lib文件夹中的模块中扩展ActiveRecord::Base,然后在模型中扩展我的新类,这样我就可以在几种DB之间进行切分,这是一种有点枯燥的方法。注意:由于3.2.1,您根本不必解析数据库url。您可以直接传递它以建立连接。仅供参考,使ActiveRecord::Secondary从ActiveRecord::Base继承可能会导致问题:
ActiveRecord::StatementInvalid:找不到表'secondaries'
@Ajedi32如果您将抽象类设置为true,我忘了将其包括在内,而不是执行所有这些手动解析,您可以使用Ruby的URI,例如:
parsed_URI=URI(ENV['PRIMARY\u DATABASE\u URL'])