Rails6.0で新たに追加されたマルチDBの機能を試してみました。
Railsのバージョン | MySQLのバージョン |
---|---|
6.0.0.rc1 | 5.6.39 |
- 参照
1. database.yml
にspecification
を設定
マルチ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"
...
今回は、first
とsecond
という名前を設定しました。
specification
によってmigrateフォルダは分かれます。first
はデフォルトのdb/migrate
フォルダが使われ、second
はmigrations_paths
で指定したdb/second_migrate
が使われます。
2. DB create
database.yml
の設定が完了したら、db:create
を行います。
db:create
の後ろにオプションでspecification
を指定することができます。
specification
を指定しない場合、first
とsecond
両方の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
オプションでwriting
とreading
を指定できます。
app/models/user.rb
class User < ApplicationRecord
connects_to database: { writing: :first, reading: :second }
end
これで、User
モデルはfirst
が書き込み用、second
が読み込み用となりました。