【问题标题】:Ruby - Sequel Model to access multiple databasesRuby - 用于访问多个数据库的 Sequel 模型
【发布时间】:2014-02-11 15:45:53
【问题描述】:

我正在尝试将 Ruby Sequel::Model ORM 功能用于 Web 服务,其中每个用户的数据都存储在单独的 MySQL 数据库中。可能有成千上万的用户和数据库。

在每个网络请求上,我都想构造连接字符串以连接到用户的数据,完成工作,然后关闭连接。

使用 Sequel 时,我可以为特定代码块指定要使用的数据库:

    Sequel.connect(:adapter=>'mysql', :host=>'localhost', database=>'test1') do |db|
        db.do_something()
    end

这一切都很好,我可以对特定用户的数据库执行 Sequel 操作。但是,当使用Sequel::Model 时,当我来执行我的数据库操作时,它看起来像这样:

    Supplier.create(:field1 => 'TEST')

即它不采用db 作为参数,所以只使用一些共享数据库配置。

我可以通过两种方式配置 Model 使用的数据库,或者设置全局 DB 变量:

    DB = Sequel.connect(:adapter=>'mysql', :host=>'localhost', database=>'test1')

    class Supplier < Sequel::Model
    end

或者,我可以只为模型设置数据库:

    Sequel::Model.db = Sequel.connect(:adapter=>'mysql', :host=>'localhost', database=>'test1')

    class Supplier < Sequel::Model
    end

在任何一种情况下,像这样设置共享变量都不好 - 可能会同时处理多个请求,每个请求都需要自己的数据库配置。

有没有办法解决这个问题?有没有办法使用Sequel::Model 指定每个请求的数据库配置?

顺便说一句,我在使用 DataMapper 时遇到了类似的问题,我现在想知道如果使用 Ruby,是否只有一个多租户数据库是唯一的选择,尽管我更愿意避免这种情况因为它限制了可扩展性。

非常感谢您提供解决方案或任何相关讨论。

谢谢 皮特

【问题讨论】:

    标签: ruby sequel multiple-databases


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      实际上,在您的情况下,使用任意服务器扩展可能比分片更好:

      DB.with_server(:host=>'hash_host_b', :database=>'backup') do
        DB.synchronize do
          # All queries here default to the backup database on hash_host_b
        end
      end
      

      见: http://sequel.jeremyevans.net/rdoc/files/doc/sharding_rdoc.html#label-arbitrary_servers+Extension

      【讨论】:

      • 这看起来像我所追求的 - 没有尝试过,但看起来像答案,谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多