postgresSQLで始めるSQL

4 min read読了の目安(約4200字

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

[~] $ docker --version
Docker version 20.10.2, build 2291f61


postgresSQLのDocker環境を構築

postgresの公式Dockerイメージの取得

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

[~] $ docker pull postgres:13.2

Dockerコンテナをバックグラウンドで起動

コンテナをバックグラウンドで起動します。

 [~] $ docker run --name postgres -d -e POSTGRES_PASSWORD=password postgres:13.2

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

This environment variable is required for you to use the PostgreSQL image. It must not be empty or undefined. This environment variable sets the superuser password for PostgreSQL. The default superuser is defined by the POSTGRES_USER environment variable.

コンテナが起動したことを確認し、コンテナにアクセス

[~] $ docker container ls | grep postgres
4d3d9b7cdc91   postgres:13.2             "docker-entrypoint.s…"   5 hours ago   Up 5 hours    5432/tcp                            postgres
[~] $ docker container exec -it postgres /bin/bash
root@4d3d9b7cdc91:/#


postgresSQLにデータベースを作成

デフォルトのロールで接続

root@4d3d9b7cdc91:/# psql -U postgres
psql (13.2 (Debian 13.2-1.pgdg100+1))
Type "help" for help.

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

postgres=#

postgresSQLはデフォルトのロールとして「postgres」が定義されています。\duコマンドを実行すると、スーパーユーザであることが確認できます。

https://www.postgresql.org/docs/13/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.

CREATE ROLE

新しいロールを作成しますが、後にここで作成したロールでログインするのでログイン権限を付与します。

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=#

CREATE DATABASE

データベースを所有するユーザのロール名をuser1として、新しいデータベースを作成します。

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
root@4d3d9b7cdc91:/#

作成したロールとデータベースでログイン

先程作成したロールとデータベースを指定してアクセスできることを確認します。これでSQLを実行できる環境が整いました!

root@4d3d9b7cdc91:/# psql -U user1 testdb1
psql (13.2 (Debian 13.2-1.pgdg100+1))
Type "help" for help.

testdb1=>