Dockerで起動したPostgreSQLの中身を見よるためには、起動しているコンテナの中に入り、psqlコマンドでを実行しても対話モードに入る必要があります。
しかし、psqlコマンドを実行しても、対話モードに入れないことがあります。
Docker上のPostgreSQLpsqlを使うためにはユーザーの指定が必要ですが、それが適切にできていないことが原因であることがほとんどです。
ここでは、Docker上のPostgreSQLコンテナの中でpsqlコマンドを実行して対話モードに入る手順をまとめています。
Docker上のPostgreSQLコンテナの中に入る
まずは、Docker上で起動しているPostgreSQLコンテナの中に入る必要があります。
コンテナが起動中かどうか、およびコンテナ名はdocker psコマンドで確認してください。
PostgreSQLのサービスを提供しているコンテナ名(あるいはコンテナID)を指定して、PostgreSQLコンテナの中に入ります。
$ docker-compose exec コンテナ名 bashなお、以下でも指定したコンテナ内に入れます。
$ docker exec -it コンテナ名 bash実例
#Docker上のPostgreSQLコンテナに入る
$ docker-compose exec DB bash
bash-4.4#「bash-4.4#」と表示されPostgreSQLのコンテナ内を起動しているディレクトリのbashが起動します。これでコマンドを打ち込むことができます。
psqlを実行してpostgreSQLの対話モードに入る
psqlを実行してpostgreSQLの対話モードに入るためにはルートユーザーを指定する必要があります。ルートユーザーの指定方法は以下の2つがあります。
- psqlのオプションでルートユーザーを指定する。
- ルートユーザーをユーザーを指定してから、psqlを実行する。
psqlのオプションでルートユーザーを指定する
PostgreSQLのデフォルトのルートユーザーは「postgres」です。
このため、ユーザーを指定する「-U」オプションで「postgres」を指定して「psql」コマンドを実行します。
$ psql -U postgres実例
#Docker上のPostgreSQLコンテナに入る
$ docker-compose exec サービス名 bash
#ユーザー名をpostgresとしてpostgreSQLの対話モードに入る
bash-4.4# psql -U postgres
psql (11.1)
Type "help" for help.
postgres=#無事、対話モードに入りコマンドが入力できる状態になっています。(postgres=#)
コマンドの補足
・psql
PostgreSQLの対話モードに入るためのコマンド。-Uはユーザー名を指定するオプション。
・dockerコンテナから抜ける場合
「exit」を入力しEnter
・psqlから抜ける場合
「\p」を入力しEnter
現在のユーザーにルートユーザーを指定してからpsqlを実行する
先に現在のユーザーにルートユーザーを指定してから、psqlコマンドを実行することもできます。
ルートユーザーの指定は以下のコマンドで実行できます。
$ su - <ルートユーザー名>デフォルトのルートユーザー名は「postgres」なのでコマンドは、su - postgresになります。
なお、suはSubstitute Userの略です。
「-」はログインシェルを使用するオプションで、「-l」と同じです。
「-」オプションを使うと、環境変数を引き継がず、切り替えたユーザー専用のものになります。
「-」オプションを使わない場合は、環境変数はユーザー切り替え前と同じものになります。
これで、既にユーザーは指定済みなので、あとは「psql」コマンドを実行します。オプションは不要です。
$ psql実例
#Docker上のPostgreSQLコンテナに入る
$ docker-compose exec DB bash
#現在のユーザーをルートユーザー「postgres」に変更
bash-4.4# su - postgres
#postgresの対話モードに入る
d9287101e757:~$ psql
psql (11.1)
Type "help" for help.
postgres=#無事、対話モードに入りコマンドが入力できる状態になっています。(postgres=#)
・suで指定したユーザーやdockerコンテナから抜けるexitを入力しEnter
・psqlから抜ける\pを入力しEnter
・プロンプトの切り替わり
bash-4.4#はdockerのpostgresqlコンテナのbashn。d9287101e757:~$はルートユーザーpostgresのbash。postgres=#はpostgresqlの対話モード。
DBの中身を見る
対話モード(psql)の中でデータベースの中身を参照するためによく使うコマンドは以下になります。
コマンドは冒頭に\をつける(¥マークを一回クリック)ことに注意してください。
| コマンド | 内容 | 補足 |
|---|---|---|
| \? | ヘルプ。\コマンド一覧 | \hとは異なる |
| \du | ユーザー毎のロール一覧 | display users |
| \l | DB一覧 | list |
| \c DB名 | DBに接続 | change。プロンプトがDB名になる |
| \dt | テーブル一覧(タイプ、オーナー) | display table |
| \z | テーブル一覧(アクセス権一覧) | \dpと同じ(display privilage) |
| \conninfo | 接続中のDB情報(DB名、ユーザー名、ソケット、ポート番号) | connecting infomation |
| \h | ヘルプ。SQLコマンド一覧 | SQLは大文字・小文字で区別なし |
| \s | \コマンド実行結果の履歴 | sequence |
| \q | 対話モードの終了 | quit |
困ったら「\?」でコマンド一覧を表示することができます。
SQLコマンドでテーブルの中身操作する方法
psqlの対話モードの状態ではSQLのコマンドを実行して、テーブルのデータを取得したり変更することもできます。
SQLのコマンド一覧を表示したい場合は\hを実行します。
なお、SQLコマンドの実行は冒頭の「\」は不要です。末尾に「;」をつける必要があります。
実行したコマンドから抜ける時は「q」をクリックします。
参考にSQLの主なコマンドを記載しておきます。
情報の抽出の主なSQLコマンド(select)
| コマンド | 内容 |
|---|---|
| select * from テーブル名 | テーブル内のすべてのデータを表示 |
| select * from テーブル名 order by カラム名; | 指定したカラムの昇順で表示 |
| select * from テーブル名 order by カラム名 desc; | 指定したカラムの降順で表示 |
| select * from テーブル名 where 条件 | 指定した条件にマッチするデータのみ抜き出す |
| select * from テーブル名 limit 数値; | 指定した数だけ表示 |
| select * from テーブル名 offset 数値; | 指定した行から表示 |
| select distinct カラム名 from テーブル名; | 指定したカラムだけ表示 |
| select sum(カラム名) from テーブル名; | 指定したカラムの合計値を返す。数値以外が含まれる場合はエラー |
| select max(カラム名) from テーブル名; | 指定したカラムの最大値を返す |
| select min(カラム名) from テーブル名; | 指定したカラムの最少値を返す |
| select avg(カラム名) from テーブル名; | 指定したカラムの平均値を返す |
複数の組み合わせも可能です。
table_name=# select * from users where id<=100 order by id desc limit 3 offset 3;
id | email | encrypted_password | reset_password_token | reset_password_sent_at | remember_created_at | created_at |
updated_at | confirmation_token | confirmed_at | confirmation_sent_at
----+---------+--------------------------------------------------------------+----------------------+------------------------+---------------------+----------------------------+-------
---------------------+--------------------+----------------------------+----------------------
11 | 111@666 | $2a$12$HWVMKItT06zqXdZOJmcL7ellVA2wmzTqRYmqfTJrZuyl/4l2I.NwS | | | | 2021-04-15 12:16:22.196066 | 2021-0
4-15 12:16:22.196066 | | 2021-04-15 12:23:57.727656 |
10 | 111@333 | $2a$12$J6aIpKcN.SQa1ZfAFhMPLuaPHShL6MXyZhJwZB8SPCkaGbc9XR7EW | | | | 2021-04-15 12:13:21.482411 | 2021-0
4-15 12:13:21.482411 | | 2021-04-15 12:23:57.727656 |
9 | 111@111 | $2a$12$mU8jVlbfvrrmmfAqBgaEYOboYllYOS7AAtHGTTfVhLWqU0TRAGmEG | | | | 2021-04-15 11:52:24.830282 | 2021-0
4-15 11:52:24.830282 | | 2021-04-15 12:23:57.727656 |
(3 rows)データ操作の主なSQLコマンド(update, delete, alter)
| コマンド | 内容 |
|---|---|
| create database DB名 | DB作成 |
| update テーブル名 set カラム名=値 where 条件; | データ変更 |
| delete from テーブル名 where 条件 | 行の削除 |
| alter table テーブル名 owner to オーナー名 | オーナーの変更 |
| alter table テーブル名 add カラム名 データ型 | カラムの追加 |
| alter table テーブル名 drop カラム名 | カラムの削除 |
| alter table テーブル名 alter カラム名 type データ型 | カラムの追加 |
=# delete from users where email='222@333';
DELETE 1SQLで文字列を入力するときの注意点
文字列は「'(シングルクオテーション)」で囲む必要があります。「"(ダブルクォーテーション)」ではエラーになので注意してください。
##(エラー例1)囲まない場合
=# update users set email = 999@888 where id = 9;
ERROR: operator does not exist: integer @ integer
LINE 1: update users set email = 999@888 where id = 9;##(エラー例2)ダブルクオテーションで囲んだ場合
=# update users set email="222@333" where id=9;
ERROR: column "222@333" does not exist
LINE 1: update users set email="222@333" where id=9;##(成功)シングルクオテーションで囲んだ場合
=# update users set email='222@333' where id=9;
UPDATE 1対話モードに入らずにDBのデータを見る方法
主なコマンド
なお、psqlの対話モードで実行する一部のコマンドは、対話モードに入らずとも実行することができます。
| コマンド | 内容 |
|---|---|
| $ psql -? | ヘルプ表示。--helpと同じ |
| $ psql -l | データベース一覧 |
| $ psql -V | PostgreSqlバージョン表示 |
| $ psql -d DB名 | DBに接続 |
困ったら「psql -? -h」を実行するとヘルプが表示されます。(※-hは--hostのショートオプション)
実例
#dockerコンテナ内に入る
$ docker-compose exec <サービス名> bash
#対話モードにならずにコマンドを実行
bash-4.4# psql -U postgres -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
----------------------------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |または
#dockerコンテナ内に入る
$ docker-compose exec <サービス名> bash
#ルートユーザーをpostgresに変更
bash-4.4# su - postgres
#対話モードにならずにコマンドを実行
d9287101e757:~$ psql -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
----------------------------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |

