Ruby on rails Rails中的多个数据库
这能做到吗?在单个应用程序中,它使用SQLite管理许多项目。 我希望我的应用程序管理的每个项目都有一个不同的数据库。。因此,一个结构相同的数据库有多个副本,但其中包含不同的数据。我将根据URI上的参数选择要使用的副本Ruby on rails Rails中的多个数据库,ruby-on-rails,database,activerecord,Ruby On Rails,Database,Activerecord,这能做到吗?在单个应用程序中,它使用SQLite管理许多项目。 我希望我的应用程序管理的每个项目都有一个不同的数据库。。因此,一个结构相同的数据库有多个副本,但其中包含不同的数据。我将根据URI上的参数选择要使用的副本 这是为1做的。安全我是这类编程的新手,我不希望因为某种原因,在一个项目中,另一个项目被破坏。。2.旧项目的轻松备份和归档默认情况下,Rails不是为多数据库体系结构而设计的,在大多数情况下,它毫无意义。 但是,您可以使用不同的数据库和连接 以下是一些参考资料: 您还应该查
这是为1做的。安全我是这类编程的新手,我不希望因为某种原因,在一个项目中,另一个项目被破坏。。2.旧项目的轻松备份和归档默认情况下,Rails不是为多数据库体系结构而设计的,在大多数情况下,它毫无意义。 但是,您可以使用不同的数据库和连接 以下是一些参考资料:
将连接切换到
方法)on.*
methods系列)如果您能够控制和配置每个Rails实例,并且能够承受由于它们处于备用状态而造成的资源浪费,那么可以省去一些麻烦,只需更改database.yml以修改每个实例上使用的数据库连接。如果您关心性能,这种方法不会降低性能 对于仅绑定到一个数据库上的单个唯一表的模型,可以在模型内调用“建立\ U连接”:
establish_connection "database_name_#{RAILS_ENV}"
如下所述:
您将有一些模型使用来自一个数据库的表,而其他不同的模型使用来自其他数据库的表
如果您有相同的表,在不同的数据库中是通用的,并且由一个模型共享,ActiveRecord将不会帮助您。早在2009年,我使用Rails 2.3.8在一个项目中就需要这个。我为每个客户都有一个数据库,我用他们的ID命名了数据库。因此,我创建了一个方法来更改ApplicationController内部的连接:
def change_database database_id = params[:company_id]
return if database_id.blank?
configuration = ActiveRecord::Base.connection.instance_eval { @config }.clone
configuration[:database] = "database_name_#{database_id}_#{RAILS_ENV}"
MultipleDatabaseModel.establish_connection configuration
end
并将该方法作为前置过滤器添加到所有控制器:
before_filter :change_database
因此,对于每个控制器的每个操作,当定义并设置params[:company_id]时,它会将数据库更改为正确的数据库
为了处理迁移,我扩展了ActiveRecord::Migration,使用一个方法查找所有客户并使用每个ID迭代一个块:
class ActiveRecord::Migration
def self.using_databases *args
configuration = ActiveRecord::Base.connection.instance_eval { @config }
former_database = configuration[:database]
companies = args.blank? ? Company.all : Company.find(args)
companies.each do |company|
configuration[:database] = "database_name_#{company[:id]}_#{RAILS_ENV}"
ActiveRecord::Base.establish_connection configuration
yield self
end
configuration[:database] = former_database
ActiveRecord::Base.establish_connection configuration
end
end
请注意,这样做,您就不可能在同一个操作中从两个不同的数据库进行查询。您可以再次调用change_数据库,但当您尝试使用从不再链接到正确数据库的对象执行查询的方法时,它会变得很糟糕。此外,很明显,您将无法连接属于不同数据库的表
为了正确地处理这个问题,ActiveRecord应该进行相当大的扩展。现在应该有一个插件来帮助你解决这个问题。一个快速的研究给了我这个:
DB Charmer:
我愿意试一试。让我知道什么适合您。值得注意的是,在所有这些解决方案中,您需要记住关闭自定义数据库连接。否则,您将耗尽连接并看到奇怪的请求超时问题 一个简单的解决方案是清除\u活动\u连接!在控制器中的后过滤器中
after_filter :close_custom_db_connection
def close_custom_db_connection
MyModelWithACustomDBConnection.clear_active_connections!
end
我通过使用另一个数据库将其添加到我的模型顶部来克服这个问题
class Customer < ActiveRecord::Base
ENV["RAILS_ENV"] == "development" ? host = 'devhost' : host = 'prodhost'
self.establish_connection(
:adapter => "mysql",
:host => "localhost",
:username => "myuser",
:password => "mypass",
:database => "somedatabase"
)
class客户“mysql”,
:host=>“localhost”,
:username=>“我的用户”,
:password=>“mypass”,
:database=>“somedatabase”
)
在您的config/database.yml中执行以下操作
default: &default
adapter: postgresql
encoding: unicode
pool: 5
development:
<<: *default
database: mysite_development
test:
<<: *default
database: mysite_test
production:
<<: *default
host: 10.0.1.55
database: mysite_production
username: postgres_user
password: <%= ENV['DATABASE_PASSWORD'] %>
db2_development:
<<: *default
database: db2_development
db2_test:
<<: *default
database: db2_test
db2_production:
<<: *default
host: 10.0.1.55
database: db2_production
username: postgres_user
password: <%= ENV['DATABASE_PASSWORD'] %>
default:&default
适配器:postgresql
编码:unicode
游泳池:5
发展:
您在问题中描述的是多租户(结构相同的数据库,每个数据库中的数据不同)。这是最好的选择
对于Rails中多个数据库的一般问题:ActiveRecord支持多个数据库,但Rails不提供管理它们的方法。我最近创建了gem来解决这个问题。到目前为止,我找到的最佳解决方案是:
我们可以采用3种数据库体系结构
- 单租户的单数据库
- 每个租户的单独架构
- 租户共享模式
注意:它们有一定的优点和缺点,这取决于您的用例
我从这里得到这个!这对我很有帮助
您可以将gem用于rails
从Rails 6开始,您可以在上查看视频参考,支持多个数据库:
很抱歉回答得太晚和太明显,但我认为它是可行的,因为它现在得到了支持。说得再好不过了。例如,环境还使得在生产和开发之间使用不同的数据库系统变得更容易。我不建议这样做,我计划做类似的选择,因为我希望某些数据库表有数亿条记录。将数据库拆分为每个客户端的单独实例将允许我使用一个应用程序服务器和多个数据库服务器。您的最后两个链接不再相关。第一个版本可能会因为新版本的rails而过时。请在回答中内联相关代码。Rails确实使用连接池,它应该防止过度使用特定的连接限制。该插件已被作者终止,截至2015年1月2日,没有
class Customers < ActiveRecord::Base
establish_connection "db2_#{Rails.env}".to_sym
end