首页 > 解决方案 > Rails 水平分片在测试环境中未连接

问题描述

我在 Rails 应用程序中实现了简单的水平分片。有 2 个分片:主分片和存档分片。

应用程序在实际运行时在生产/开发/测试中工作,但是在运行测试套件时,永远不会连接到存档分片。

我在全局设置中设置了一个超级简单的测试test_helper.rb来测试这个:

    ActiveRecord::Base.connected_to(shard: :primary, role: :reader) do
      p JobState.count
    end

    ActiveRecord::Base.connected_to(shard: :archive, role: :reader) do
      p JobState.count
    end

其中的输出是

2 
No connection pool for 'ActiveRecord::Base' found for the 'archive' shard.

数据库存在,迁移成功运行。配置没有问题。

令人困惑的部分是运行实际的应用程序RAILS_ENV=test rails s工作得很好,就像RAILS_ENV=test rails console. 我可以毫无问题地运行确切的查询。

所以肯定有某种初始化没有为测试运行器运行,但我不知道它是什么。

我不认为这是应用程序配置的问题,但我也会在此处包括:

test:
  primary:
    <<: *default
    url: <%= ENV['TEST_DATABASE_URL'] %>
  archive:
    <<: *default
    url: <%= ENV['TEST_ARCHIVE_DATABASE_URL'] %>
class ApplicationRecord < RxModule::ApplicationRecord
  self.abstract_class = true
  connects_to shards: {
    primary: { writer: :primary, reader: :primary },
    archive: { writer: :archive, reader: :archive }
  }
end

有人对这里有任何见解吗?

标签: ruby-on-rails

解决方案


我最终找到了解决方案,但我觉得我留下的问题多于答案。

问题是:reader:writer在.connects_toApplicationRecord

Rails 期望这些/默认值是:reading, 和:writing. 更改connect_to语句以及connected_to整个应用程序中的任何语句都解决了整个问题,尽管我不知道为什么它在更改之前在所有其他上下文中都有效。


推荐阅读