LoginSignup
2
2

More than 3 years have passed since last update.

Rails6 のちょい足しな新機能を試す35(multidb migration --database オプション編)

Last updated at Posted at 2019-06-13

はじめに

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つ下の階層が、 backbonelibrary の2つに分かれていることに注意してください。
また、 library の方は、 migration のファイルの保存先のディレクトリを migrations_paths で指定しています。

config/database.yml
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_developmentbooks テーブルがあることと 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 modelbin/rails g scaffold にも、 --database(--db) オプションが追加されているようです。

schema ファイル

スキーマのファイルは、 backbone_schema.rb と library_schema.rb の2つが作成されます。

試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try035_database_option

参考情報

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2