🧊

PostgreSQLをスクリプトで実行しよう!

2024/12/06に公開

概要

先日DockerでPostgreSQLを環境構築する方法を紹介させて頂きました!🎉🎉
私の大学の授業でもこのDockerを使った方法が導入され、順調に進められていることを大変嬉しく思います。
その中で、「SQLをJavaみたいに書いて実行したい」という声を聞いたので、今回は皆さんの環境でスクリプトで書いて、実行する方法を紹介します!!
https://zenn.dev/urassh/articles/0ccdb9a18924f1

前提

  • 上記で紹介した方法のDockerを用いたPostgreSQLの環境構築ができていること。

使用例

あなたのエディタでselect.sqlを編集し、
PostgreSQLのコンテナに自動で反映され、
PostgreSQLで実行できています。

編集前 編集後

ファイル構成

scriptsフォルダを作成し、その中にscript.sqlというファイルを作りましょう!!

今回使うファイル構成

各ファイルの内容

script.sql

このファイルは任意のSQLを書いて実行するためのファイルです。
今回の例では、このように書いていますが、SQL文であればなんでも大丈夫です🙆‍♂️

SELECT * FROM users;

compose.yml

このファイルの変更箇所は一箇所あります!!
- ./scripts:/scripts を追記してください!!

volumesって何?

volumes というのはコンテナ内にあるデータを自分の環境に同期したり、残したい時に使います。
volumesには主に2種類あり、名前付きボリュームバインドマウントです。

  1. 名前付きボリューム
    Dockerがファイルの保存場所を自動で決めて、そこに保存してくれます。
    今回だとpostgres_dataという名前でpostgresqlの管理しているデータベースを保存しています。
  2. バインドマウント
    コンテナ内のファイルと自分の環境のファイルを同期したい時に使います。
    例えば、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.sqlselect 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