Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中的多个数据库_Ruby On Rails_Database_Activerecord - Fatal编程技术网

Ruby on rails Rails中的多个数据库

Ruby on rails Rails中的多个数据库,ruby-on-rails,database,activerecord,Ruby On Rails,Database,Activerecord,这能做到吗?在单个应用程序中,它使用SQLite管理许多项目。 我希望我的应用程序管理的每个项目都有一个不同的数据库。。因此,一个结构相同的数据库有多个副本,但其中包含不同的数据。我将根据URI上的参数选择要使用的副本 这是为1做的。安全我是这类编程的新手,我不希望因为某种原因,在一个项目中,另一个项目被破坏。。2.旧项目的轻松备份和归档默认情况下,Rails不是为多数据库体系结构而设计的,在大多数情况下,它毫无意义。 但是,您可以使用不同的数据库和连接 以下是一些参考资料: 您还应该查

这能做到吗?在单个应用程序中,它使用SQLite管理许多项目。 我希望我的应用程序管理的每个项目都有一个不同的数据库。。因此,一个结构相同的数据库有多个副本,但其中包含不同的数据。我将根据URI上的参数选择要使用的副本


这是为1做的。安全我是这类编程的新手,我不希望因为某种原因,在一个项目中,另一个项目被破坏。。2.旧项目的轻松备份和归档默认情况下,Rails不是为多数据库体系结构而设计的,在大多数情况下,它毫无意义。 但是,您可以使用不同的数据库和连接

以下是一些参考资料:


您还应该查看名为DB Charmer的项目:

DbCharmer是一个简单但功能强大的ActiveRecord插件,它可以完成以下几项功能:

  • 允许您轻松管理AR模型的连接(
    将连接切换到
    方法)
  • 允许您将AR型号的默认连接切换到单独的服务器/数据库
  • 允许您轻松选择查询的位置(
    on.*
    methods系列)
  • 允许您自动向从属设备发送读取查询,而主设备将处理所有更新
  • 将多个数据库迁移添加到ActiveRecord

  • 如果您能够控制和配置每个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