はじめに
Rails 6 に追加されそうな新機能を試す第35段。 今回は、 複数データベース migration --databaseオプション
編です。
Rails 6 は、 複数データベースをサポートしています。それに伴い、migration のファイルをデータベース毎に分けられるように rails g migration
に --database(--db)
オプションが追加されています。
Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
PostgreSQL 10.7 で確認しました。
$ rails --version
Rails 6.0.0.rc1
rails プロジェクトを作る
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
config/database.yml を編集する
今回の機能を試すため、接続先のデータベースを2つにします。
1つは、 backbone_development
で、もう1つは、 library_development
です。
backbone_development
の migration のファイルは、従来通りのディレクトリ db/migrate
に作成します。
library_development
の migration のファイルは、 db/library_migrate
ディレクトリに作成します。
なお、今回は、development 環境だけ2つのデータベースに設定しました。
development
の1つ下の階層が、 backbone
と library
の2つに分かれていることに注意してください。
また、 library
の方は、 migration のファイルの保存先のディレクトリを migrations_paths
で指定しています。
development:
backbone:
<<: *default
database: backbone_development
library:
<<: *default
database: library_development
migrations_paths: db/library_migrate
backbone_development 用に users テーブルの migration ファイルを作る
backbone_development に users
テーブルを作るための、 migration ファイルを作成します。
これは、Rails 5 までと同じです。
$ bin/rails g migration CreateUser name
Running via Spring preloader in process 2931
invoke active_record
create db/migrate/20190608225735_create_user.rb
library_development 用に books テーブルの migration ファイルを作る
今度は、library_development に books
テーブルを作るための、 migration ファイルを作成します。
ここで、今回のちょい足し機能 --database (--db)
オプションを使います。
$ bin/rails g migration CreateBook title --db library
Running via Spring preloader in process 2937
invoke active_record
create db/library_migrate/20190608225808_create_book.rb
ファイルのパスが db/library_migrate/20190608225808_create_book.rb
になっていますね。
db:create を実行する
データベースを作成するため、 bin/rails db:create
を実行します。
$ bin/rails db:create
Created database 'backbone_development'
Created database 'library_development'
...
2つのデータベースが作成されました。
migration を実行する
テーブルを作成するため、 migration
を実行します。
$ bin/rails db:migrate
bash-4.4# bin/rails db:migrate
== 20190608225735 CreateUser: migrating =======================================
-- create_table(:users)
-> 0.0113s
== 20190608225735 CreateUser: migrated (0.0113s) ==============================
== 20190608225808 CreateBook: migrating =======================================
-- create_table(:books)
-> 0.0138s
== 20190608225808 CreateBook: migrated (0.0139s) ==============================
psql で確認する
psql で確認してみます。
データベースが2つできていることを確認します。
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
----------------------+----------+----------+------------+------------+-----------------------
...
backbone_development | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
library_development | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
...
backbone_development
データベースに切り替えます。
postgres=# \c backbone_development
psql (11.3, server 10.7)
You are now connected to database "backbone_development" as user "postgres".
users
テーブルができていることを確認します。
backbone_development=# \dt;
List of relations
Schema | Name | Type | Owner
--------+----------------------+-------+----------
...
public | users | table | postgres
...
users
テーブルのカラムも確認してみます。
backbone_development=# \d users;
Table "public.users"
Column | Type | Collation | Nullable | Default
--------+-------------------+-----------+----------+-----------------------------------
id | bigint | | not null | nextval('users_id_seq'::regclass)
name | character varying | | |
Indexes:
"users_pkey" PRIMARY KEY, btree (id)
今度は、 library_development
にデータベースを切り替えます。
backbone_development=# \c library_development
psql (11.3, server 10.7)
You are now connected to database "library_development" as user "postgres".
library_development
に books
テーブルがあることと books
テーブルのカラムを確認します。
library_development=# \dt;
List of relations
Schema | Name | Type | Owner
--------+----------------------+-------+----------
...
public | books | table | postgres
...
library_development=# \d books;
Table "public.books"
Column | Type | Collation | Nullable | Default
--------+-------------------+-----------+----------+-----------------------------------
id | bigint | | not null | nextval('books_id_seq'::regclass)
title | character varying | | |
Indexes:
"books_pkey" PRIMARY KEY, btree (id)
各データベース用のコマンド
今回、使いませんでしたが、各データベース用のコマンドが使えるようになります。
$ bin/rails -T | grep db | grep -e backbone -e library
rails db:create:backbone # Create backbone database for current environment
rails db:create:library # Create library database for current environment
rails db:drop:backbone # Drop backbone database for current environment
rails db:drop:library # Drop library database for current environment
rails db:migrate:backbone # Migrate backbone database for current environment
rails db:migrate:library # Migrate library database for current environment
rails db:migrate:status:backbone # Display status of migrations for backbone database
rails db:migrate:status:library # Display status of migrations for library database
model の作成や scaffold
bin/rails g model
や bin/rails g scaffold
にも、 --database(--db)
オプションが追加されているようです。
schema ファイル
スキーマのファイルは、 backbone_schema.rb と library_schema.rb の2つが作成されます。
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try035_database_option