postgreSQLについて理解を深めた
はじめに
これまでにちょいちょいと触ってきたpostgreSQLだけど、その使い方がいまいち理解できていないと感じていた。 なんとなくデータベースを作って、 なんとなくユーザーを作って、 なんとなくデータベースにアクセスして...で使ってきた感覚があり、それがとても気持ち悪かったので理解を深める目的で調べた。
概要:postgreSQL
- リレーショナルデータベース管理システム
- 複数のロールによる複数のデータベースの管理ができる
- どのpostgresqlに、どのロールで、どのデータベースにアクセスするか?の視点が大事
- postgresqlにアクセスする=データベースのコンソールに入る
- postgresqlでは、ユーザー+権限=ロール として、ロールのみをあつかう。
- postgresqlのコンソールに入るには、
psql -h ホスト名 -p ポート番号 -U ロール名 -d データベース名
と打つ - ターミナルにアクセスする際、ホスト名とポート番号を省略するとローカルのpostgresqlが対象となる
気付き
postgreSQLを使う上で自分に欠けていた大事な視点は、「どのpostgreSQLに、どのロールで、どのデータベースにアクセスするか?」だと気づいた。
これを抑えていれば、postgreSQLのデータベースにアクセスするとき、psql -h ホスト名 -p ポート番号 -U ロール名 -d データベース名
と打つ理由がわかる。
また、Ruby on RailsでpostgreSQLを扱う際にも、設定ファイルであるdatabase.yml
になんの情報を記述すればいいかがなんとなく見えてきた。
database.yml
についてはまだ理解が浅いので、調べて別記事にしようと思う。
予想と検証
これまでの学習を元に、「postgreSQLをRailsで使えるようにするには?」を考えてみる。
予想
おそらく以下を揃え、Railsプロジェクト側でpostgreSQLを受け入れる設定をし、「どのpostgreSQLに、どのロールで、どのデータベースにアクセスするか?」の設定をすれば使えるはず。
- postgreSQLがインストールされているサーバー
- Railsプロジェクトで使うデータベースA
- データベースAにアクセスして中身を変更できる権限を持ったロールB
検証
Rails newするときに、使用するDBにpostgreSQLを指定してあげれば簡単に使えるようになるのは承知の上で、あえて後からsqlite3 -> postgreSQLとDBを変更することをやってみる。
以下手順
Rails new postgres_app
rails db:system:change --to=postgresql
#これを打つことでdatabase.ymlとGemfileをpostgreSQLを使用するためのものに書き換えてくれる。rails g model User name:text address:text age:integer
#適当なモデル作成rails db:migrate
ここでエラーになった。エラー文は、
ActiveRecord::NoDatabaseError: connection to server on socket "/tmp/.s.PGSQL.5432" failed: FATAL: database "postgres_app_development" does not exist
postgreSQLにpostgres_app_developmentっていうデータベースがないよって言われた。
なるほど、rails db:system:change --to=postgresql
はpostgreSQLのデータベースまでは作ってくれないらしい。
続き
createdb postgres_app_development
#データベース作成rails db:migrate
#再度migrateを試みる。今度は成功。psql postgres_app_development
#データベースコンソールにアクセス\d users
#usersテーブルを確認
ちゃんと作成されている。
感想
postgreSQLについての理解が深まった感触がある。 特に、「どのpostgreSQLに、どのロールで、どのデータベースにアクセスするか?」の視点を持てたのが良かった。
次はdatabase.ymlについて深堀してみたいと思う。