データベースの勉強をするときに書いたクエリを実際に試すことはとても重要ですよね。しかし、私はこれまで書いたクエリを試すための環境構築が面倒で下のサイトを利用して SQL を実行していました。
www.db-fiddle.com
このサイトはとても便利なのですが、毎回 CREATE TABLE
から始めなければならなくてこれはこれで面倒なのと、やはりローカルに入れて勉強した方が深いところまで学ぶことができるのではないかと感じたので試してみることにしました。
Docker image の取得
PostgreSQL は DockerHub に公式イメージが公開されているのでそれを使います。バージョンに特にこだわりはないのと、最近 PostgreSQL の大規模なバク修正があったと聞いたので latest を使います。
$ docker pull postgres:latest
docker-compose.yaml の作成
毎回コンテナを起動するときにいろいろ指定するのは面倒なので全部 docker-compose.yaml に書いておきます。
version: '3' services: db: image: postgres container_name: db restart: always environment: POSTGRES_PASSWORD: your-password volumes: - ./data:/var/lib/postgresql/data - ./sql:/home
コンテナデータを永続化するためにホストのディレクトリ(./data
)をコンテナ内でデータベース情報の入るディレクトリ(/var/lib/postgresql/data
)にマウントします。また、SQLファイルを入れるディレクトリ(./sql
)もマウントしています。
構築した環境を使う
準備はできたのでコンテナを起動します。
$ docker-compose up -d $ docker-compose ps # コンテナが無事起動しているか確認 Name Command State Ports ------------------------------------------------------- db docker-entrypoint.sh postgres Up 5432/tcp
コンテナが無事に起動出来たら学習用のデータベースを作りましょう。
$ docker exec -it db /bin/bash root@92913b69db39:/# createdb -U postgres testdb root@92913b69db39:/# psql -U postgres -d testdb psql (13.1 (Debian 13.1-1.pgdg100+1)) Type "help" for help. testdb=# \q root@92913b69db39:/# exit $
今回は単に学習用なのでユーザーは postgres を使ってしまいます。
次に、このデータベースにテーブルを作成する SQL を実行します。
create_table.sql
CREATE TABLE testtable ( id INTEGER PRIMARY KEY, name VARCHAR(100) NOT NULL );
テーブルを作成するには
$ docker exec -it db psql -U postgres -d testdb -f /home/create_table.sql
を実行します。CREATE TABLE
という出力が出れば成功です。
最後に、SQL を実行するコマンドの効率化をしましょう。毎回実行するたびに上のコマンドを実行するのは面倒なのでシェルスクリプトを作ります。
runner.sh
#!/bin/bash docker exec -it db psql -U postgres -d testdb -f /home/$1
chmod +x runnser.sh
で実行権限を付与しておけば、
$ ./runner.sh create_table.sql
のように実行することができます。これで勉強がはかどりますね!