【Mac OS】Railsで開発しているサービスにおけるPostgreSQLでよく使うコマンド


開発環境

・Mac OS 10.12.6
・Rails 5.1.6
・PostgreSQL 10.1

投稿の目的

  • 投稿者はrailsで独学でサービス開発を始めたピチピチの文系大学生であり、今回Railsで開発をしている際にherokuにデプロイするタイミングで、SQLiteからPostgreSQLへの移行に苦しめられながらなんとか脱出しながらも、ローカルの開発環境もPostgreSQLに揃えようと試みる中で、慣れないpsqlの記法にハマった。

  • そんな中で、Qiita上だけでも、PostgreSQLの導入方法、使用方法に関して、様々な投稿があるが、初心者に対しては少し省略されて書かれている感が強く、かなり時間をかけたという個人的な反省から、自分の復習も兼ねて、噛み砕いて整理することを目的とする。

PostgreSQLでよく使うコマンド集

・brew install postgresql

Macで開発環境をそこまで触っていない人は、yumなどを使ってのinstallをするには環境設定は足りていないため、Homebrewを用いての導入が好ましい。
Homebrewの導入

・postgres --version

導入できたかどうかの確認も含めて、postgresqlのバージョンを確認しましょう。

ここで少しややこしいので一度整理をしておきますが、

-psql
-pg_ctl
-postgres

の3つがコマンドの中で多発します。これを書いている自分も理解できていない部分もあるかもしれませんが、下記に整理をしてみます。

・psql

PostgreSQLのオフィシャルっぽい文書には下記のように書いてあります。

psqlとはPostgreSQLのターミナル型フロントエンドです。 対話的に問い合わせを入力し、それをPostgreSQLに対して発行して、結果を確認することができます。 また、ファイルから入力を読み込むことも可能です。 さらに、スクリプトの記述を簡便化したり、様々なタスクを自動化したりする、いくつものメタコマンドとシェルに似た各種の機能を備えています。

超簡単に言うと、普通に"SQL"の説明をしていて、データベースに入ったり、データベースから何かデータを取ってきたりっていうのをコマンドオプションとして指定できるツールということで、「データベースに何かアクションがしたいなぁ」と思った時はこのコマンドを使用することが多いようです。

※具体的な使い方(オプション等の付け方)に関しては、コマンドラインでpsql --helpで確認できます。

・pg_ctl

これもまたPostgreSQLのオフィシャルっぽい文書には下記のように書いてあります。

pg_ctlはPostgreSQLデータベースクラスタの初期化、PostgreSQLのデータベースサーバ(postgres)を起動、停止、再起動する、あるいは稼働中のサーバの状態を表示するためのユーティリティです。 サーバは手動で起動することも可能ですが、pg_ctlは、ログ出力のリダイレクトや、ターミナルとプロセスグループの適切な分離などの作業をカプセル化してくれます。 さらにシャットダウン制御のための便利なオプションも提供します。

これは超簡単に言うと、PostgreSQLサーバの初期化、起動、停止、制御ができるコマンドです。
詳しくはこの記事を読んでもらえば分かりやすいかなと思うのですが、設定が必要です。でも、それさえしてしまえば、バックグラウンドで起動してくれるので、新しくタブを使わなくて大丈夫になります(何より、pg_ctl startで起動、pg_ctl stopで停止できるのが便利です)

順番的には、pg_ctl start → psql 〇〇 → psql 〇〇 →.... → pg_ctl stop みたいな順番で使うイメージです。

※具体的な使い方(オプション等の付け方)に関しては、コマンドラインでpg_ctl --helpで確認できます。

・postgres

こちらはコマンドではありません。PostgreSQLのデータベースサーバーです。
実はデータベースに接続するためには、データベースサーバーという部分を通過することが求められます。

今作成しているクライアントアプリケーションがデータベースに接続するためには、稼働中のpostgresインスタンス(仮想サーバー)というものに接続をする必要があります。 その後、postgresは接続を取り扱うために別のサーバプロセスを開始します。

混乱の元凶は、最初にPostgreSQLのデータベースサーバー起動の際に、下記のようなコマンドを打つからだと思います。

postgres -D /usr/local/var/postgres

これは、/usr/local/var/postgres というフォルダをデータベースクラスタを作成するディレクトリとして、そこに複数のデータベース格納領域を作ることを指し、つまり、/usr/local/var/postgresディレクトリ内のpostgresサーバーを起動するということです。
通常は1対1でデータベースサーバーとデータベースは対応しますが、複数のデータベースサーバーで1つのデータベースを管理する体制もデータベースクラスタの特徴らしいです(認識が間違っていたらすいません....)

ちなみに、これは、1つ前に紹介した、pg_ctl startと同じ作業です。違いがあるとしたら、上記はフォアグラウンドで起動しますが、下記はバックグラウンドで起動する点です。
起動の度に専用のタブを立ち上げるのは面倒なので、繰り返しになりますが、この記事を参考に環境変数の設定を行いましょう。

※具体的な使い方(オプション等の付け方)に関しては、コマンドラインでpostgres --helpで確認できます。

・psql -l

-データベースを一覧表示してくれる

・psql <データベース名>

-データベースへ接続

・\d

-テーブルを一覧表示してくれる

・\d <テーブル名>

-テーブルのカラムを一覧表示してくれる

・\du

-ユーザーを一覧表示してくれる

・\q

-ログアウトする