Несколько баз данных с Rails не работают для удаленной базы данных

#ruby-on-rails #postgresql #multiple-databases

#ruby-on-rails #PostgreSQL #Несколько баз данных

Вопрос:

У меня есть удаленная база данных postgres, доступная только для чтения, которая поддерживается из экземпляра docker cardano-db-sync.

Мне удалось подключить к нему базу данных разработки, она работала нормально. Но поскольку он доступен только для чтения, я хотел добавить еще одну базу данных для пользовательских и других изменяемых таблиц.

это настройка, которую я подготовил:

 # config/database.yml
default: amp;default
  adapter: postgresql
  encoding: unicode
  pool: 5

development:
  <<: *default
  primary:
    database: 'db_sync'
  cexplorer:
    database: 'cexplorer'
    username: <%= ENV['HOST_PG_DATABASE_USERNAME'] %>
    password: <%= ENV['HOST_PG_DATABASE_PASSWORD'] %>
    host: <%= ENV['HOST_PG_DATABASE_IP'] %>
    port: <%= ENV['HOST_PG_PORT'] %>
 

затем абстрагированные классы, как в инструкциях документа

 # app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  connects_to database: { reading: :primary, write: :primary}
end

# app/models/cexplorer_record.rb
class CexplorerRecord < ApplicationRecord
  self.abstract_class = true

  connects_to database: { reading: :cexplorer }
end
 

затем несколько таблиц для тестирования:

 # app/models/pool_hash.rb
class PoolHash < CexplorerRecord
    self.table_name = 'pool_hash'
end

# app/models/pool.rb
class Pool < ApplicationRecord
end
 

Основная база данных, похоже, работает нормально, rails c но после использования PoolHash я получаю эту ошибку:

 $ rails c
Running via Spring preloader in process 79267
Loading development environment (Rails 6.0.3.4)
2.6.1 :001 > PoolHash.count
Traceback (most recent call last):
        4: from (irb):1
        3: from app/models/pool_hash.rb:1:in `<main>'
        2: from app/models/cexplorer_record.rb:1:in `<main>'
        1: from app/models/cexplorer_record.rb:4:in `<class:CexplorerRecord>'
ActiveRecord::AdapterNotSpecified (The `cexplorer` database is not configured for the `development` environment.)

Available databases configurations are:

default
development
2.6.1 :002 > Pool.count
   (0.5ms)  SELECT COUNT(*) FROM "pools"
 => 0 
2.6.1 :003 > 
 

Я не понимаю, почему он говорит, что cexplorer не настроен для разработки, когда вместо database.yml этого находится прямо в той же конфигурации, которая работала, когда она была без :primary

Обновить

кажется, что при перемещении <<: *default ситуация улучшилась:

 development:
  primary:
    <<: *default
    database: 'swan_db_sync'
  cexplorer:
    <<: *default
    database: 'cexplorer'
    username: <%= ENV['HOST_PG_DATABASE_USERNAME'] %>
    password: <%= ENV['HOST_PG_DATABASE_PASSWORD'] %>
    host: <%= ENV['HOST_PG_DATABASE_IP'] %>
    port: <%= ENV['HOST_PG_PORT'] %>
 

но теперь у меня другая проблема:

 rails c        
Running via Spring preloader in process 79798
Loading development environment (Rails 6.0.3.4)
2.6.1 :001 > Pool.count
   (4.2ms)  SELECT COUNT(*) FROM "pools"
 => 0 
2.6.1 :002 > PoolHash.count
Traceback (most recent call last):
        1: from (irb):2
ActiveRecord::ConnectionNotEstablished (No connection pool with 'CexplorerRecord' found.)
 

ОБНОВЛЕНИЕ 2

Теперь я попробовал настройку, описанную в этой статье, управление несколькими базами данных в одной ссылке приложения Rails с 2017 года.

Все работает нормально. Это также имеет больше смысла для моей цели, чем то, что указано в документации rails. Я надеюсь, что старая статья не преподнесет мне сюрпризов в будущем.

Ответ №1:

У меня была такая же проблема, мое решение состояло в том, чтобы поместить establish_connection·:cexplorer мой CexplorerRecord класс ниже connects_to строки.