💭
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