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のオプションでルートユーザーを指定する
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 1
SQLで文字列を入力するときの注意点
文字列は「'
(シングルクオテーション)」で囲む必要があります。「"
(ダブルクォーテーション)」ではエラーになので注意してください。
##(エラー例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 |