{"id":21285524,"url":"https://github.com/takeyuweb/rails6-multidb-sample","last_synced_at":"2026-04-27T18:02:24.176Z","repository":{"id":39377744,"uuid":"209798842","full_name":"takeyuweb/rails6-multidb-sample","owner":"takeyuweb","description":"Rails 6.0 の DatabaseSelector middleware を理解する","archived":false,"fork":false,"pushed_at":"2023-01-19T14:56:31.000Z","size":1484,"stargazers_count":0,"open_issues_count":32,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-15T15:12:58.315Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://qiita.com/takeyuweb/items/e33db948e69c7e4420cc","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/takeyuweb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-09-20T13:36:27.000Z","updated_at":"2019-10-03T20:23:48.000Z","dependencies_parsed_at":"2023-02-02T09:31:07.786Z","dependency_job_id":null,"html_url":"https://github.com/takeyuweb/rails6-multidb-sample","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/takeyuweb/rails6-multidb-sample","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takeyuweb%2Frails6-multidb-sample","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takeyuweb%2Frails6-multidb-sample/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takeyuweb%2Frails6-multidb-sample/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takeyuweb%2Frails6-multidb-sample/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/takeyuweb","download_url":"https://codeload.github.com/takeyuweb/rails6-multidb-sample/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takeyuweb%2Frails6-multidb-sample/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32348058,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T17:12:42.749Z","status":"ssl_error","status_checked_at":"2026-04-27T17:12:41.658Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-21T11:20:54.871Z","updated_at":"2026-04-27T18:02:24.158Z","avatar_url":"https://github.com/takeyuweb.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rails6-multidb-sample\n\n次のことを確認するためのサンプルアプリケーションです。\n\n- PostgreSQL の非同期レプリケーション\n- Rails 6.0 の Multiple DBs 機能\n- DatabaseSelector を使った HTTP Method による接続先自動切り替え\n\n## 試す\n\n```bash\n$ docker-compose up\n```\n\n```bash\n$ docker-compose exec app bundle exec rails db:setup\n```\n\nOpen http://localhost:3000/posts\n\n## PostgreSQL の非同期レプリケーション\n\nDocker Compose を使って、2 つの PostgreSQL コンテナを立ち上げます。\n一方をレプリケーションの parimary に、もう一方を readonly (Hot Standby) として使います。\n\n## Rails 6.0 の Multiple DBs 機能\n\n[Active Record で複数のデータベース利用](https://railsguides.jp/active_record_multiple_databases.html)\n\n次のようにレプリケーションの parimary （読み書き可能）と readonly （読み込み専用）を `host` で指定します。\nYAML 中の `primary` `primary_readonly` は後で参照するのに使う識別子で任意に設定可能です。\n\n```yaml\ndevelopment:\n  primary:\n    \u003c\u003c: *default\n    database: MyApp_development\n    host: pg_primary\n  primary_readonly:\n    \u003c\u003c: *default\n    database: MyApp_development\n    host: pg_readonly\n    replica: true   # この接続はレプリカであることRailsに伝える\n```\n\n```ruby\nclass ApplicationRecord \u003c ActiveRecord::Base\n  self.abstract_class = true\n  connects_to database: { writing: :primary, reading: :primary_readonly }\nend\n```\n\n```ruby\nActiveRecord::Base.connected_to(role: :writing) do\n  # このブロック内のコードはすべて writing ロールで接続される\n  ActiveRecord::Base.current_role #=\u003e :writing\nend\n\nActiveRecord::Base.connected_to(role: :reading) do\n  # このブロック内のコードはすべて reading ロールで接続される\n  ActiveRecord::Base.current_role #=\u003e :reading\nend\n```\n\n## DatabaseSelector を使った HTTP Method による接続先自動切り替え\n\n`config/environments/development.rb` で以下を設定しています。\n\n```ruby\nconfig.active_record.database_selector = { delay: 2.seconds }\nconfig.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver\nconfig.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session\n```\n\n[コネクションの自動切り替えを有効にする - Active Record で複数のデータベース利用](https://railsguides.jp/active_record_multiple_databases.html#%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E8%87%AA%E5%8B%95%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)\n\n### 試してみる\n\nhttp://localhost:3000/posts で記事を登録したり、表示したりすると次のようなログが表示され、どちらのデータベースにクエリが送信されたか確認できます。\n\n```\napp_1          | Started PATCH \"/posts/1\" for 172.21.0.1 at 2019-10-03 18:37:22 +0000\napp_1          | Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1\npg_primary_1   | 2019-10-03 18:37:22.227 UTC [66] LOG:  statement: SELECT 1\napp_1          | Processing by PostsController#update as HTML\napp_1          |   Parameters: {\"authenticity_token\"=\u003e\"tJBhu5R3jC6vI+SubacKMK4bAyLUi62Tq5GkXpI/jhwPPLlpzC546Nwmaurjgp45kFieKwScCboGzkXgsC71cw==\", \"post\"=\u003e{\"title\"=\u003e\"Hello world!!\", \"body\"=\u003e\"one two three\"}, \"commit\"=\u003e\"Update Post\", \"id\"=\u003e\"1\"}\npg_primary_1   | 2019-10-03 18:37:22.229 UTC [66] LOG:  statement: SHOW search_path\npg_primary_1   | 2019-10-03 18:37:22.230 UTC [66] LOG:  execute a1: SELECT \"posts\".* FROM \"posts\" WHERE \"posts\".\"id\" = $1 LIMIT $2\npg_primary_1   | 2019-10-03 18:37:22.230 UTC [66] DETAIL:  parameters: $1 = '1', $2 = '1'\napp_1          |   Post Load (0.4ms)  SELECT \"posts\".* FROM \"posts\" WHERE \"posts\".\"id\" = $1 LIMIT $2  [[\"id\", 1], [\"LIMIT\", 1]]\napp_1          |   ↳ app/controllers/posts_controller.rb:67:in `set_post'\napp_1          | Redirected to http://localhost:3000/posts/1\napp_1          | Completed 302 Found in 4ms (ActiveRecord: 0.8ms | Allocations: 1373)\napp_1          |\napp_1          |\napp_1          | Started GET \"/posts/1\" for 172.21.0.1 at 2019-10-03 18:37:22 +0000\napp_1          | Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1\npg_primary_1   | 2019-10-03 18:37:22.237 UTC [66] LOG:  statement: SELECT 1\napp_1          | Processing by PostsController#show as HTML\napp_1          |   Parameters: {\"id\"=\u003e\"1\"}\npg_primary_1   | 2019-10-03 18:37:22.238 UTC [66] LOG:  execute a1: SELECT \"posts\".* FROM \"posts\" WHERE \"posts\".\"id\" = $1 LIMIT $2\npg_primary_1   | 2019-10-03 18:37:22.238 UTC [66] DETAIL:  parameters: $1 = '1', $2 = '1'\napp_1          |   Post Load (0.3ms)  SELECT \"posts\".* FROM \"posts\" WHERE \"posts\".\"id\" = $1 LIMIT $2  [[\"id\", 1], [\"LIMIT\", 1]]\napp_1          |   ↳ app/controllers/posts_controller.rb:67:in `set_post'\napp_1          |   Rendering posts/show.html.erb within layouts/application\napp_1          |   Rendered posts/show.html.erb within layouts/application (Duration: 0.2ms | Allocations: 95)\napp_1          | Completed 200 OK in 6ms (Views: 4.7ms | ActiveRecord: 0.3ms | Allocations: 6369)\napp_1          |\napp_1          |\napp_1          | Started GET \"/posts/1\" for 172.21.0.1 at 2019-10-03 18:37:36 +0000\napp_1          | Cannot render console from 172.21.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1\npg_primary_1   | 2019-10-03 18:37:36.607 UTC [66] LOG:  statement: SELECT 1\napp_1          | Processing by PostsController#show as HTML\napp_1          |   Parameters: {\"id\"=\u003e\"1\"}\npg_readonly_1  | 2019-10-03 18:37:36.609 UTC [30] LOG:  statement: SELECT 1\npg_readonly_1  | 2019-10-03 18:37:36.609 UTC [30] LOG:  execute a1: SELECT \"posts\".* FROM \"posts\" WHERE \"posts\".\"id\" = $1 LIMIT $2\npg_readonly_1  | 2019-10-03 18:37:36.609 UTC [30] DETAIL:  parameters: $1 = '1', $2 = '1'\napp_1          |   Post Load (0.5ms)  SELECT \"posts\".* FROM \"posts\" WHERE \"posts\".\"id\" = $1 LIMIT $2  [[\"id\", 1], [\"LIMIT\", 1]]\napp_1          |   ↳ app/controllers/posts_controller.rb:67:in `set_post'\napp_1          |   Rendering posts/show.html.erb within layouts/application\napp_1          |   Rendered posts/show.html.erb within layouts/application (Duration: 0.2ms | Allocations: 92)\napp_1          | Completed 200 OK in 8ms (Views: 5.3ms | ActiveRecord: 0.5ms | Allocations: 6356)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftakeyuweb%2Frails6-multidb-sample","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftakeyuweb%2Frails6-multidb-sample","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftakeyuweb%2Frails6-multidb-sample/lists"}