💭

rails構築中にデータベースについて理解したこと

に公開

はじめに

学習の一環として、Railsアプリをローカル環境で開発してきました。これまでは「とりあえず動けばいいや」というスタンスで進めていましたが、特にデータベースに関する理解が不十分であると感じています。このままデータベースについての理解が曖昧な状態で進めるのは気持ちが悪いため、一度整理してしっかりと理解を深めたいと思っています。

とりあえず理解したこと

正しいイメージ

% rails db:create

→ PostgreSQLに「データベース(箱)」を作成。(例:app_development、app_test)
この時点ではまだ中身は空っぽ。テーブルもなし。作られるのは、あくまで 論理的な「データベース単位」(テーブル空間ではない)。

% rails db:migrate

→ マイグレーションファイルに従って、そのデータベースの中にテーブルやカラムを作成。(例:apps テーブルなど)
Railsでは db/migrate/*.rb に書かれた内容が、SQLに変換されて実行される。マイグレーションが実行されると、schema.rb というファイルにもテーブル構造が記録される。

✅ 「テーブル空間」について補足
PostgreSQL内部の「データ保存場所」管理単位であり、普通のRails開発では気にする必要はないとの事。
pg_defaultなどはPostgreSQLの仕組み上の話。

MVCのM(モデル)について

モデルは?

% rails generate model App title:string done:boolean
  • モデルクラス(Ruby):app/models/app.rb
  • マイグレーションファイル:db/migrate/xxx_create_apps.rb
    を同時に生成。

その後、rails db:migrate を実行すると、マイグレーションファイルが実際にデータベースの中にテーブル(apps)を作成。

図でイメージ(ざっくり)

PostgreSQL
├── app_development   ← rails db:create
│   ├── apps           ← rails db:migrate + モデル
│   └── schema_migrations(内部管理テーブル)
├── todo_test
├── postgres(管理用DB)

railsでのデータベース操作

% rails db
psql (17.5 (Homebrew))
"help"でヘルプを表示します。

user=> \db
      テーブル空間一覧
    名前    | 所有者 | 場所 
------------+--------+------
 pg_default | *****  | 
 pg_global  | *****  | 
(2 行)

user=> \l
                                                           データベース一覧
   名前    | 所有者 | エンコーディング | ロケールプロバイダー | 照合順序 | Ctype(変換演算子) | ロケール | ICUルール: |  アクセス権限   
-----------+--------+------------------+----------------------+----------+-------------------+----------+------------+-----------------
 postgres  | *****  | UTF8             | libc                 | ja_JP    | UTF-8             |          |            | 
 template0 | *****  | UTF8             | libc                 | ja_JP    | UTF-8             |          |            | =c/*****       +
           |        |                  |                      |          |                   |          |            | *****=CTc/eiken
 template1 | *****  | UTF8             | libc                 | ja_JP    | UTF-8             |          |            | =c/*****       +
           |        |                  |                      |          |                   |          |            | ****=CTc/*****
 app_test  | ****   | UTF8             | libc                 | ja_JP    | UTF-8             |          |            | 
 user      | ****   | UTF8             | libc                 | ja_JP    | UTF-8             |          |            | 

※今後も追記していこうと思います。

Discussion