SQLを使いこなしたい!虎の巻 #1 ~ Dockerを使ったPostgreSQLの環境構築編 ~

研修期間中にSQLをサクサク使いこなせるようになりたいと思い、今回"SQLを使いこなしたい!虎の巻"シリーズを始めました。まずはDockerでPostgreSQLの環境構築からスタートです!
2020.10.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

気付いたら10月で外の寒さについていけてない、新卒エンジニアのたいがーです?

研修が始まり、早半年。研修期間中にお勧めしていただいたものの、読めていない本も早くも軽く溜まってきたところ。(積読消費したい)

Amazon RDSについて調べるたびに"DB、そんな触ったことないんだよな…"となっていました。研修中の今こそSQLを勉強するタイミング!ということで、今回はSQLを使いこなせるまでのシリーズを始めてみることにしました?

題して、"SQLを使いこなしたい!虎の巻"シリーズです!

PostgreSQLを触る環境を整えよう

手を動かしながらSQLの学習を進めていこう!ということで、実行環境を整えていきたいと思います。

このシリーズでは、Docker環境下でPosgreSQLを使っていきます!

実行環境

  • macOS Catalina version 10.15.7
  • Docker version 19.03.12

Dockerを使ってみる

PostgreSQL公式のDockerイメージをダウンロードし、コンテナを起動します。

Dockerイメージのダウンロード、起動

- PostgreSQLの最新verの公式Dockerイメージを取得 -
$ docker pull postgres

- コンテナをバックグラウンドで起動 -
$ ducker run --name postgres -d -e POSTGRES_PASSWORD=test  postgres

- コンテナが起動したかを確認する -
$ docker ps

docker runをするときに気をつけるべきこと

POSTGRES_PASSWORDWORDについて

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.

(訳)この環境変数は、PostgreSQLイメージを使用するために必要です。空または未定義であってはなりません。この環境変数は、PostgreSQLのスーパーユーザーパスワードを設定します。デフォルトのスーパーユーザーは、POSTGRES_USER環境変数によって定義されます。

Note 1: The PostgreSQL image sets up trust authentication locally so you may notice a password is not required when connecting from localhost (inside the same container). However, a password will be required if connecting from a different host/container.

(訳)注1:PostgreSQLイメージはローカルでtrust認証を設定するため、ローカルホスト(同じコンテナー内)から接続するときにパスワードが不要であることに気付く場合があります。ただし、別のホスト/コンテナから接続する場合は、パスワードが必要になります。

Note 2: This variable defines the superuser password in the PostgreSQL instance, as set by the initdb script during initial container startup. It has no effect on the PGPASSWORD environment variable that may be used by the psql client at runtime, as described at here. PGPASSWORD, if used, will be specified as a separate environment variable.

(訳)注2:この変数は、コンテナーの初期起動時にinitdbスクリプトによって設定されたPostgreSQLインスタンスのスーパーユーザーパスワードを定義します。 こちらで説明されているように、実行時にpsqlクライアントによって使用される可能性のあるPGPASSWORD環境変数には影響しません。 PGPASSWORDを使用する場合は、個別の環境変数として指定されます。

つまり、POSTGRES_PASSWORDはPostgreSQLイメージを使用するために必要な変数になっています。しかし、イメージはローカルでtrust認証を認定するため、ローカルホストから接続する時は不要です。

それでは、いよいよデータベースを作成していきます。

データベースユーザとデータベースの作成

- コンテナにアクセス -
$ docker exec -it posgres bash

- 各種コマンドが存在するかを確認する -
# which psql createuser createdb

- データベースユーザ"user1"を作成し、確認する -
# createuser -U postgres user1
# psql -U postgres -c '\du'

- 表示された表の中にuser1があるかを確認する -

- データベース"testdb1"を作成し、確認する -
# createdb -U postgres -O user1 -E UTF8 --locale=C -T template0 testdb1
# psql -U postgres -l

- 表示された表の中にtestdb1があるかを確認する -

- 作成したデータベースユーザで、作成したデータベースにアクセス -
# psql -U user1 testdb1

- 日付が取得できるか試してみる -
testdb1-> select current_date;

- 今日の日付が取得できれば成功 -

テストユーザー、テストデータベースの作成、SQLの実行まで確認できました。

SQLを使いこなすまでの一歩目が終了しました

ということで、最初のステップである環境構築まで終了しました。今までDockerもあまり使ったことがなかったので、ゆっくりコマンドを見返すことができ満足です!笑

これから簡単なSQLから始め、徐々にレベルを上げて触っていきたいと思います!これからもお付き合いください。

以上、たいがーでした?

参考資料