Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Rails6.0のマルチDBを試してみた

More than 1 year has passed since last update.

Rails6.0で新たに追加されたマルチDBの機能を試してみました。

Railsのバージョン MySQLのバージョン
6.0.0.rc1 5.6.39

1. database.ymlspecificationを設定

マルチDBにおいて各DBを識別するための、specificationという概念が登場しています。specificationには、任意で好きな名前を設定できます。

config/database.yml
...
development:
  first:
    <<: *default
    database: rails6_development
  second:
    <<: *default
    database: rails6_development_second
    migrations_paths: "db/second_migrate"
...
test:
  first:
    <<: *default
    database: rails6_test
  second:
    <<: *default
    database: rails6_test_second
    migrations_paths: "db/second_migrate"
...

今回は、firstsecondという名前を設定しました。
specificationによってmigrateフォルダは分かれます。firstはデフォルトのdb/migrateフォルダが使われ、secondmigrations_pathsで指定したdb/second_migrateが使われます。

2. DB create

database.ymlの設定が完了したら、db:createを行います。
db:createの後ろにオプションでspecificationを指定することができます。
specificationを指定しない場合、firstsecond両方のDBが作られます。

2-1. firstだけの場合

$ rails db:create:first

2-2. secondだけの場合

$ rails db:create:second

2-3. 両方の場合

$ rails db:create

3. modelを作る

3-1. databaseオプション有りの場合

databaseオプションでspecificationを指定できます。

$ rails g model Post content:text posted_at:timestamp --database=first

以下1つのmigrateファイルができます。

db/migrate/20190529024126_create_posts.rb

3-2. databaseオプション無しの場合

$ rails g model User name:string age:integer

以下2つのmigrateファイルができます。

db/migrate/20190524025133_create_users.rb
db/second_migrate/20190524025133_create_users.rb

4. migrateする

4-1. migrate実行

$ rails db:migrate

4-2. migrateの状態を確認

$ rails db:migrate:status

specificationのmigrate状況が見れます。

database: rails6_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190524025133  Create users
   up     20190529024126  Create posts


database: rails6_development_second

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20190524025133  Create users

5. modelで読み込み用と書き込み用のDBを分ける

connects_toオプションでwritingreadingを指定できます。

app/models/user.rb
  class User < ApplicationRecord
    connects_to database: { writing: :first, reading: :second }
  end

これで、Userモデルはfirstが書き込み用、secondが読み込み用となりました。

taiteam
finergy-a-tm
大阪府大阪市北区角田町8番1号 梅田阪急ビル オフィスタワー35F
https://finergy.a-tm.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away