Docker上のPostgreSQLコンテナの中に入って中身を見る手順とコマンドの詳細を実例で解説|psqlで対話モードにならない時の対処法(DBやテーブル、主なSQL一覧)

docker-prograshi(プロぐらし)-kv Docker
記事内に広告が含まれていることがあります。

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つがあります。

ルートユーザーの指定方法
  1. psqlのオプションでルートユーザーを指定する。
  2. ルートユーザーをユーザーを指定してから、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
\lDB一覧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 -VPostgreSqlバージョン表示
$ 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 |


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