使用 rails 配置多个数据库

Configuration for multiple databases with rails

A Rails 7.0.3 应用程序具有以下 database.yml 配置,默认块由 rails 应用程序初始化过程生成。

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  primary:
    database: user_development
    username: deploy_root
    password: password
    host: "localhost"
    migrations_paths: db/user_migrate
  primary_replica:
    database: user_development
    username: deploy_readonly
    password: password
    host: "localhost"
    replica: true
  forum:
    database: forum_development
    username: deploy_root
    password: password
    host: "localhost"
    migrations_paths: db/forum_migrate
  forum_replica:
    database: forum_development
    username: deploy_readonly
    password: password
    host: "localhost"
    replica: true
  office:
    database: office_development
    username: deploy_root
    password: password
    host: "localhost"
    migrations_paths: db/office_migrate

test:
  <<: *default
  primary:
    database: user_test
    username: deploy_root
  primary_replica:
    database: user_test
    username: deploy_readonly
  forum:
    database: forum_test
    username: deploy_root
  forum_replica:
    database: forum_test
    username: deploy_readonly
  office:
    database: office_test
    username: deploy_root

  <<: *default
  primary:
    host: 'primary.domain.ws'
    username: deploy_root
    password: [omiss]
    database: user_production
    pool: 50
    timeout: 5000
  primary_replica:
    host: 'replica.domain.ws'
    username: deploy_readonly
    password: [omiss]
    database: user_production
    pool: 50
    timeout: 5000
    replica: true
  forum:
    database: forum_production
    username: deploy_root
    password: [omiss]
    host: 'forum.domain.ws'
    migrations_paths: db/forum_migrate
  forum_replica:
    database: forum_production
    username: deploy_readonly
    password: [omiss]
    host: 'forumreplica.domain.ws'
    replica: true
  office:
    database: office_production
    username: deploy_root
    password: [omiss]
    host: 'office.domain.ws'
    migrations_paths: db/office_migrate

然而,在 运行 bin/rails db:create 应用程序抱怨

no implicit conversion of nil into String
Couldn't create '' database. Please check your configuration.

语法是在其他 rails 7 个应用程序中使用的语法,尽管不在 partnet/replica 上下文和 seems to respect the rails guides 指南中。

上面的字符串被解释为 nil 有什么问题?

更新 如果开发块改成

development:
  <<: *default
  database: office_development
  username: deploy_root
  password: password
  host: "localhost"
  migrations_paths: db/office_migrate
  primary:
    [...]

已创建默认数据库,但未创建主数据库和副本数据库。因此 YAML 结构存在问题,尽管它成功地进行了 lints。

需要删除对共享属性的调用 <<: *default。 这将允许处理开发数据库。

属性

  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

被添加到每个块。

另一个 hang-up 是测试数据库,副本:

  primary_replica:
    database: user_test
    username: deploy_readonly
  forum_replica:
    database: forum_test
    username: deploy_readonly

需要删除才能完成该过程。 我推测假设从主副本读取的对象与从副本读取的对象完全相同,因此这是过度的