postgreSQLについて理解を深めた

はじめに

これまでにちょいちょいと触ってきたpostgreSQLだけど、その使い方がいまいち理解できていないと感じていた。 なんとなくデータベースを作って、 なんとなくユーザーを作って、 なんとなくデータベースにアクセスして...で使ってきた感覚があり、それがとても気持ち悪かったので理解を深める目的で調べた。

概要:postgreSQL

  • リレーショナルデータベース管理システム
  • 複数のロールによる複数のデータベースの管理ができる
  • どのpostgresqlに、どのロールで、どのデータベースにアクセスするか?の視点が大事
  • postgresqlにアクセスする=データベースのコンソールに入る
  • postgresqlでは、ユーザー+権限=ロール として、ロールのみをあつかう。
  • postgresqlのコンソールに入るには、psql -h ホスト名 -p ポート番号 -U ロール名 -d データベース名 と打つ
  • ターミナルにアクセスする際、ホスト名とポート番号を省略するとローカルのpostgresqlが対象となる

気付き

postgreSQLを使う上で自分に欠けていた大事な視点は、「どのpostgreSQLに、どのロールで、どのデータベースにアクセスするか?」だと気づいた。 これを抑えていれば、postgreSQLのデータベースにアクセスするとき、psql -h ホスト名 -p ポート番号 -U ロール名 -d データベース名 と打つ理由がわかる。

また、Ruby on RailspostgreSQLを扱う際にも、設定ファイルであるdatabase.ymlになんの情報を記述すればいいかがなんとなく見えてきた。 database.ymlについてはまだ理解が浅いので、調べて別記事にしようと思う。

予想と検証

これまでの学習を元に、「postgreSQLRailsで使えるようにするには?」を考えてみる。

予想

おそらく以下を揃え、Railsプロジェクト側でpostgreSQLを受け入れる設定をし、「どのpostgreSQLに、どのロールで、どのデータベースにアクセスするか?」の設定をすれば使えるはず。

  • postgreSQLがインストールされているサーバー
  • Railsプロジェクトで使うデータベースA
  • データベースAにアクセスして中身を変更できる権限を持ったロールB

検証

Rails newするときに、使用するDBにpostgreSQLを指定してあげれば簡単に使えるようになるのは承知の上で、あえて後からsqlite3 -> postgreSQLとDBを変更することをやってみる。

以下手順

  1. Rails new postgres_app
  2. rails db:system:change --to=postgresql #これを打つことでdatabase.ymlとGemfileをpostgreSQLを使用するためのものに書き換えてくれる。
  3. rails g model User name:text address:text age:integer #適当なモデル作成
  4. 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=postgresqlpostgreSQLのデータベースまでは作ってくれないらしい。 続き

  1. createdb postgres_app_development #データベース作成
  2. rails db:migrate #再度migrateを試みる。今度は成功。
  3. psql postgres_app_development #データベースコンソールにアクセス
  4. \d users #usersテーブルを確認

ちゃんと作成されている。

感想

postgreSQLについての理解が深まった感触がある。 特に、「どのpostgreSQLに、どのロールで、どのデータベースにアクセスするか?」の視点を持てたのが良かった。

次はdatabase.ymlについて深堀してみたいと思う。