PostgreSQL | SQLite+MySQL経験者向け、30日で習得するPostgreSQL:差分理解 - Day1 環境構築

SQL PostgreSQL
スポンサーリンク

Day1 前半のゴール

「SQLite/MySQL経験を“そのまま活かして”PostgreSQLに触り始める」

今日のテーマは PostgreSQL の最初の一歩です。
すでに SQLite と MySQL を触っている前提なので、「完全な初心者向け」ではなく、「差分を意識しながらの入門」にします。

前半のゴールはこうです。
PostgreSQL をインストールしたときに、何が動き始めるのかをイメージできる。
psql というクライアントの役割と、基本操作の流れを理解できる。
データベースとユーザーを作るときの“PostgreSQLらしい考え方”をつかめる。

ここでは OS ごとの細かい手順より、「何をしているのか」「MySQLとどこが違うのか」を丁寧にかみ砕きます。


PostgreSQLインストールで“何が入るのか”をイメージする

「サーバー本体+クライアント(psql)+管理ツールがセット」

SQLite は「1ファイル+ライブラリ」でした。
MySQL は「サーバープロセス+クライアント(mysqlコマンド)」でした。
PostgreSQL も基本は MySQL と同じで、「サーバー」と「クライアント」がセットです。

PostgreSQL をインストールすると、ざっくり次のようなものが入ります。

PostgreSQLサーバー本体(postgres プロセス)
コマンドラインクライアント(psql
データベースを格納するディレクトリ(データディレクトリ)

ここで一番大事なのは、「PostgreSQLは“最初からマルチユーザー・マルチDB前提のサーバー”」という感覚です。
SQLite のように「適当にファイルを作っておけばOK」ではなく、「サーバーに接続して、その中にDBを作る」という世界観です。

MySQL経験者視点で言うと、「mysqld と mysql クライアントの関係」が、そのまま「postgres と psql」に置き換わるイメージです。


psqlとは何か

「PostgreSQL版の“mysqlコマンド”だけど、かなり高機能な対話ツール」

psql は、PostgreSQL に付属する標準の対話型クライアントです。
MySQL でいう mysql コマンド、SQLite でいう sqlite3 コマンドに相当します。

役割はシンプルで、「PostgreSQLサーバーに接続して、SQLを送って結果を表示する」ことです。
ただし、psql は単なるSQL実行ツールではなく、メタコマンド(\d\l など)を使って、テーブル一覧やDB一覧を見たり、接続先を変えたりできる“管理コンソール”の側面も強いです。

イメージとしては、

PostgreSQLサーバー(postgres)が“本体”
psql は“リモコン兼デバッグコンソール”

という感じです。

MySQL の mysql コマンドとの大きな違いは、「バックスラッシュから始まるメタコマンドが豊富」という点です。
これが使えるようになると、GUIなしでもかなり快適に作業できます。


psqlでの基本的な接続イメージ

「“どのユーザーで、どのDBに、どのホストへ”を毎回意識する」

MySQL でも mysql -u user -p -h host dbname のように接続しましたが、psql も同じ発想です。

典型的な接続例はこんな形です。

psql -h localhost -p 5432 -U myuser mydb

ここでそれぞれの意味はこうです。

-h localhost:接続先ホスト(ローカルマシンなら localhost)
-p 5432:ポート番号(PostgreSQLのデフォルトは 5432)
-U myuser:PostgreSQLのユーザー名
mydb:接続したいデータベース名

MySQL経験者なら、「mysql -h ... -u ... -p ... dbname とほぼ同じだな」と感じるはずです。
違いとしては、PostgreSQLでは「OSユーザー」と「DBユーザー」が絡む場面があることです(後で少し触れます)。

接続に成功すると、こんな感じのプロンプトが出ます。

mydb=>

この mydb=> が、「今 mydb というDBに接続しているよ」というサインです。
ここから先は、SQLを書いてセミコロンで終わらせれば、そのまま実行されます。


psqlの“メタコマンド”のイメージ

「SQLじゃないけど、DBの中身を知るための便利コマンド」

psql には、バックスラッシュから始まる「メタコマンド」がたくさんあります。
これは SQL ではなく、「psqlに対する指示」です。

例えば、よく使うものはこんな感じです。

\l:データベース一覧を表示
\c dbname:接続先データベースを変更
\dt:テーブル一覧を表示
\d テーブル名:テーブル定義を表示

例として、接続後にこう打ってみるイメージです。

mydb=> \l

すると、サーバー上に存在するデータベースの一覧が表示されます。
MySQL の SHOW DATABASES; に近いですが、こちらはSQLではなくpsqlの機能です。

同様に、

mydb=> \dt

でテーブル一覧、

mydb=> \d users

で users テーブルの定義が見られます。

ここでのポイントは、「PostgreSQLでは、SHOW文よりもメタコマンドを多用する文化がある」ということです。
MySQL脳だと最初は違和感がありますが、慣れるとこちらの方が速くて楽です。


PostgreSQLの“データベース”と“ユーザー”の考え方

「MySQLと似ているけれど、“ロール”という概念がベースにある」

MySQL では、「ユーザー」と「データベース」があり、GRANT で権限を付けました。
PostgreSQL も似ていますが、少し用語と思想が違います。

PostgreSQL では、基本的に「ロール(role)」という概念があり、
ロールは「ログインできるユーザー」であったり、「権限の束」であったりします。

ざっくり言うと、

MySQLの“ユーザー+権限”
→ PostgreSQLの“ロール”

という対応です。

データベースは、「1つのPostgreSQLサーバーの中に複数作れる箱」です。
SQLiteの“ファイル1つ=DB1つ”とは違い、MySQLと同じく「1つのサーバーに複数DB」が前提です。


データベース作成のイメージ

「CREATE DATABASE で“箱”を作る」

PostgreSQLで新しいDBを作るときは、基本的に CREATE DATABASE を使います。
これは MySQL とほぼ同じです。

例として、「myapp_db」というDBを作るイメージを見てみます。

まず、管理用のユーザー(インストール直後なら postgres ユーザー)で psql に入ります。

psql -U postgres

接続できたら、こう実行します。

CREATE DATABASE myapp_db;
SQL

これで、myapp_db という新しいデータベースがサーバー内に作られます。
その後、psql から接続先を切り替えます。

postgres=> \c myapp_db
You are now connected to database "myapp_db" as user "postgres".
myapp_db=>

この流れは、MySQLの CREATE DATABASE myapp_db; USE myapp_db; とかなり似ています。
違いは、「USE ではなく \c を使う」という点くらいです。


ユーザー(ロール)作成のイメージ

「CREATE ROLE / CREATE USER と“ログインできるかどうか”」

PostgreSQLでは、ユーザーを作るときに CREATE ROLE または CREATE USER を使います。
実は CREATE USERCREATE ROLE ... LOGIN の糖衣構文です。

例として、「myapp_user というアプリ用ユーザーを作る」ケースを考えます。

CREATE USER myapp_user WITH PASSWORD 'strong_password_here';
SQL

これで、「ログイン可能なロール」が1つ作られます。
MySQLの CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY '...'; に近いイメージです。

次に、このユーザーに対して、特定のデータベースへの権限を与えます。

GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user;
SQL

これで、myapp_user は myapp_db に接続して、DBレベルの操作ができるようになります。
テーブル単位の権限は別途 GRANT する必要がありますが、Day1 前半では「DBに入れるようにする」イメージだけで十分です。


SQLite/MySQL経験者向けの“差分ポイント”を軽く押さえる

「ファイルではなく“クラスタ”、ユーザーは“ロール”」

前半の締めとして、SQLite/MySQLとの違いを一言でまとめておきます。

SQLite
ファイル1つがDB。
ユーザーや権限の概念はほぼなし(アプリ側で管理)。

MySQL
サーバーの中に複数DB。
ユーザーごとにホストや権限を設定。

PostgreSQL
サーバー(正確には“クラスタ”)の中に複数DB。
ユーザー=ロールで、ログインできるロール/権限だけ持つロールなど柔軟。
psql のメタコマンド文化が強い。

Day1 前半では、「PostgreSQLはMySQLと同じ“サーバー型”だけど、ロールという概念とpsqlという強力なコンソールが特徴的」という感覚を持てれば十分です。
後半では、実際の psql 操作の流れ(DB一覧を見る、ユーザーを作る、権限を与える)を、もう少し手を動かすイメージで追っていきます。


Day1 前半のまとめ

PostgreSQLは、SQLiteのような「1ファイルDB」ではなく、MySQLと同じく「サーバープロセス(postgres)の中に複数のデータベースを持つ」タイプで、インストールするとサーバー本体とデータディレクトリ、そして対話型クライアントである psql が入る。
psql は MySQL の mysql コマンドに相当するが、\l(DB一覧)、\c(接続先変更)、\dt(テーブル一覧)、\d テーブル名(定義表示)といったメタコマンドが強力で、CREATE DATABASE myapp_db; でDBを作り、CREATE USER myapp_user WITH PASSWORD '...';GRANT ALL PRIVILEGES ON DATABASE myapp_db TO myapp_user; でアプリ用ユーザーと権限を用意する、という流れを通して、「PostgreSQLでは“ロール(ユーザー+権限の束)”と“複数DBを持つサーバー”という世界観で考える」感覚をつかむのが Day1 前半の着地点になる。

タイトルとURLをコピーしました