postgresSQLで始めるSQL
使用する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コマンドを実行すると、スーパーユーザであることが確認できます。
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=>
Discussion