PostgreSQLをスクリプトで実行しよう!
概要
先日DockerでPostgreSQLを環境構築する方法を紹介させて頂きました!🎉🎉
私の大学の授業でもこのDockerを使った方法が導入され、順調に進められていることを大変嬉しく思います。
その中で、「SQLをJavaみたいに書いて実行したい」という声を聞いたので、今回は皆さんの環境でスクリプトで書いて、実行する方法を紹介します!!
前提
- 上記で紹介した方法のDockerを用いたPostgreSQLの環境構築ができていること。
使用例
あなたのエディタでselect.sqlを編集し、
PostgreSQLのコンテナに自動で反映され、
PostgreSQLで実行できています。
編集前 | 編集後 |
---|---|
![]() |
![]() |
ファイル構成
scripts
フォルダを作成し、その中にscript.sql
というファイルを作りましょう!!
今回使うファイル構成
各ファイルの内容
script.sql
このファイルは任意のSQLを書いて実行するためのファイルです。
今回の例では、このように書いていますが、SQL文であればなんでも大丈夫です🙆♂️
SELECT * FROM users;
compose.yml
このファイルの変更箇所は一箇所あります!!
- ./scripts:/scripts
を追記してください!!
volumesって何?
volumes
というのはコンテナ内にあるデータを自分の環境に同期したり、残したい時に使います。
volumes
には主に2種類あり、名前付きボリューム
とバインドマウント
です。
-
名前付きボリューム
Dockerがファイルの保存場所を自動で決めて、そこに保存してくれます。
今回だとpostgres_data
という名前でpostgresqlの管理しているデータベースを保存しています。 -
バインドマウント
コンテナ内のファイルと自分の環境のファイルを同期したい時に使います。
例えば、script.sql
を編集すると、コンテナ内のscript.sql
も変更されます。
今回だと自分の環境のscripts
フォルダとコンテナ内のscripts
フォルダを同期させていて、この中でファイルの作成削除、ファイル内容の変更も同期されます!
services:
postgres:
build: .
ports:
- "5432:5432"
environment:
POSTGRES_USER: 'guest'
POSTGRES_PASSWORD: 'password'
POSTGRES_DB: 'my-db'
volumes:
- postgres_data:/var/lib/postgresql/data
+ - ./scripts:/scripts
volumes:
postgres_data:
Dockerfile
このファイルは前回と変更はありません。
FROM postgres:latest
COPY ./init-scripts /docker-entrypoint-initdb.d/
init.sql
このファイルは前回と変更はありません。
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (username, email) VALUES
('admin', 'admin@example.com'),
('testuser', 'testuser@example.com');
実行しよう!
以下の手順に従って、データベースを立ち上げます。
データベースに接続した状態でscript.sql
を実行してみましょう!!
1. 作業フォルダに移動する
ターミナルまたはコマンドプロンプトを開き、先ほど作成したフォルダ(database-class
)に移動します。
cd database-class
2. コンテナを起動する
compose.yml
を使ってデータベースコンテナを起動します。
docker compose up -d
-
-d
オプションは、コンテナをバックグラウンドで実行するためのものです。 - 実行後、
docker ps
コマンドでコンテナが動いているか確認できます。
3. データベースに接続する
コンテナが正常に起動したら、PostgreSQLに接続できます。
以下の方法でデータベースにアクセスしてください。
docker compose exec postgres psql -U guest -d my-db
4. script.sqlを実行する
PostgreSQLに接続できたら、任意のSQL文を実行することができます。
以下のコマンドでscript.sqlを実行してみましょう!!
\i /scripts/script.sql
5. 動作確認
記載したscript.sql
が実行されていれば成功です!!
例えば、script.sql
でselect email from users;
を書いてみると、カラムがemailだけのテーブルが表示されます!!
id | username | email | created_at
----+----------+----------------------+----------------------------
1 | admin | admin@example.com | 2024-11-27 13:49:23.134934
2 | testuser | testuser@example.com | 2024-11-27 13:49:23.134934
3 | urassh | urassh@example.com | 2024-11-27 15:22:42.069975
4 | shuto | shuto@example.com | 2024-12-06 05:09:29.809065
(4 rows)
6. 終わったら...
作業が終了したら、以下のコマンドを実行してコンテナを全て削除しましょう。
また作業するときは手順2で紹介したやり方でコンテナを起動して作業できます!!
PostgreSQLを閉じる。
exit;
コンテナを削除 (作成したデータは残るよ!!)
docker compose down --rmi all
まとめ
これで、JavaやC言語のプログラムを書いて実行できるように、script.sql
を編集し、\i /scripts/script.sql
を実行すると、結果が表示されるようにすることができました!!
これでさらに、SQLを書きやすくなりましたね!👍
Discussion