🦜

PostgreSQLで始めるSQL入門

6 min read

PostgreSQL公式のDockerイメージで環境構築

使用するDockerのバージョンを確認

~  docker --version
Docker version 20.10.6, build 370c289
~ 


PostgreSQLのDockerイメージからコンテナを起動

Dockerの公式リポジトリでであるDocker Hubからpostgresの公式Dockerイメージを取得します。

~  docker pull postgres:11
11: Pulling from library/postgres
aed007321795: Pull complete
702c74af4354: Pull complete
ef123e2ab09b: Pull complete
c84418d8530c: Pull complete
b579800618be: Pull complete
6562ab9a134a: Pull complete
1c9daa412a3b: Pull complete
ddb4502f2937: Pull complete
02e243399656: Pull complete
39572b0b2f6f: Pull complete
e11139725f03: Pull complete
43726a854ff9: Pull complete
26a0f4ddb332: Pull complete
Digest: sha256:7211ad97f0ee411fc15fdde06671c38f735273c3933b5ee8b9d169e07d82303f
Status: Downloaded newer image for postgres:11
docker.io/library/postgres:11
~  docker image ls | grep postgres
postgres             11        7629fb0a5b77   2 weeks ago    283MB
~ 


取得したDockerイメージからコンテナを起動します。

~  docker run --name postgres -d -e POSTGRES_PASSWORD=password postgres:11
48130d0b4d7a7b69a050a36cd38b75ad8b8b37b57dc55962c61c4336cf3520ec
~  docker container ls | grep postgres
48130d0b4d7a   postgres:11          "docker-entrypoint.s…"   13 seconds ago   Up 12 seconds   5432/tcp                                               postgres
~ 

環境変数としてeオプションで定義しているPOSTGRES_PASSWORDは、postgresの公式DockerイメージのEnvironment Variablesから以下のように記述されていますので付与しています。

The PostgreSQL image uses several environment variables which are easy to miss. The only variable required is POSTGRES_PASSWORD, the rest are optional.


実行中のコンテナ内で対話形式のbashプロセスを立ち上げます。

~  docker container exec -it postgres bash
root@48130d0b4d7a:/#


PostgreSQLの正式なクライアントアプリケーションであるpsqlコマンドが使用できるかどうかを確認します。

root@48130d0b4d7a:/# which psql
/usr/bin/psql
root@48130d0b4d7a:/#


定義済みのロールであるpostgres(このロールはスーパーユーザ)、また定義済みのデータベースであるpostgresでデータベースサーバへ接続します。

root@48130d0b4d7a:/# psql -U postgres -d postgres
psql (11.12 (Debian 11.12-1.pgdg90+1))
Type "help" for help.

postgres=#

公式リファレンスで定義済みのロール、データベースが存在することが確認できます。

https://www.postgresql.org/docs/11/database-roles.html

In order to bootstrap the database system, a freshly initialized system always contains one predefined role. This role is always a “superuser”, and by default (unless altered when running initdb) it will have the same name as the operating system user that initialized the database cluster. Customarily, this role will be named postgres. In order to create more roles you first have to connect as this initial role.

https://www.postgresql.org/docs/11/manage-ag-createdb.html

Since you need to be connected to the database server in order to execute the CREATE DATABASE command, the question remains how the first database at any given site can be created. The first database is always created by the initdb command when the data storage area is initialized. (See Section 18.2.) This database is called postgres. So to create the first “ordinary” database you can connect to postgres.


\duコマンド、\lコマンドでデフォルトで作成されているロール、データベースを確認することができます。

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
(3 rows)

postgres=#


新しくロール、データベースを作成

新しくロールを作成し、後にこのロールでデータベースサーバへ接続するのでログイン権限を付与します。

postgres=# CREATE ROLE user1;
CREATE ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 user1     | Cannot login                                               | {}

postgres=# ALTER ROLE user1 LOGIN;
ALTER ROLE
postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 user1     |                                                            | {}

postgres=#


さらに、新しくデータベースを作成します。

postgres=# CREATE DATABASE testdb1 OWNER = user1 TEMPLATE = template0 LC_COLLATE = 'C' LC_CTYPE = 'C';
CREATE DATABASE
postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 testdb1   | user1    | UTF8     | C          | C          |
(4 rows)

postgres=#


\qコマンドで一度抜けて、psqlコマンドで作成したロールとデータベースでデータベースサーバへ接続します。これでPostgreSQLでSQLを実行できる環境が整いました!

postgres=# \q
root@48130d0b4d7a:/# psql -U user1 -d testdb1
psql (11.12 (Debian 11.12-1.pgdg90+1))
Type "help" for help.

testdb1=>