0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DockerでPostgreSQLを立ててCSV取り込みするまで

Posted at

Dockerを使って、PostgreSQLのサーバーを立て、テーブル作成とCSVでデータを取り込むまでをやってみました。
docker-composeの記事はそこそこあったけど、なぜかDockerfile単独のはあんまりなかったのと、DockerでCSVデータを取り込むまでの話はほとんどなかったので、そこまで含めたという点で、参考になる方がいましたら、という記事です。

概要

  1. postgres - Official Image | Docker Hub を使って、自分用のサーバーを立てる
  2. あらかじめ定義したDDLを使ってCREATE TABLE
  3. あらかじめ用意した、テーブルごとのCSVを使ってインポート(COPYというPostgreSQL独自のコマンド)

ソースは下記にあります。

1. Dockerfileでサーバーを立てる

Dockerfileの全容は下記です。

Dockerfile
FROM postgres:15.3

# 作成用の環境変数
ENV POSTGRES_DB mydatabase
ENV POSTGRES_USER myuser
ENV POSTGRES_PASSWORD mypassword

# クライアントで接続するための環境変数
ENV PGDATABASE mydatabase
ENV PGUSER myuser
ENV PGPASSWORD mypassword

EXPOSE 5432

COPY ./init/init.sh /docker-entrypoint-initdb.d/init.sh

COPY ./init/ /tmp/init_data/

使っているベースのイメージは postgres:15.3 。URLに使い方とか丁寧に書いてあります。

すごく気持ち悪いけど、同じような環境変数を立ててます。PostgreSQLサーバーを作るときの環境変数と、クライアントとしてそこへ接続するための環境変数。微妙に名前が違います。
クライアントとしての環境変数の説明は、PostgreSQL 8.2.6文書 環境変数 を参考に。

あと、/docker-entrypoint-initdb.d/ へ初期実行してほしいshファイルをコピーするのと、それに使用するファイルを/tmp/init_data/にコピーしてます。
このフォルダに、*.sql*.sql.gz*.shを置いておくと、実行される仕組みです。今回は、init.sh を置きました。

init.sh
psql -f /tmp/init_data/ddl.sql
psql -f /tmp/init_data/init_data_import.sql

SQLファイルを指定して、PostgreSQL(psql)を実行してるだけです。
環境変数でPGDATABASEとかを指定しているので、接続先やユーザー名は指定しなくてもつながります。もし環境変数で指定していないとすると、ここで接続先やらを書く必要があり、避けたかったのです。

2. あらかじめ定義したDDLを使ってCREATE TABLE

init.shの1行目で実行する処理。
SQLの中身はCREATE TABLEしてるだけです。

ddl.sql
CREATE TABLE IF NOT EXISTS books (
    book_id integer,
    book_name varchar(100),
    author_id integer
);

CREATE TABLE IF NOT EXISTS authors (
    author_id integer,
    author_name varchar(100)
);

3. あらかじめ用意した、テーブルごとのCSVを使ってインポート(COPYというPostgreSQL独自のコマンド)

COPYというクエリで、CSVをインポートします。

init_data_import.sql
COPY books FROM '/tmp/init_data/init_data_books.csv'
WITH (FORMAT csv, HEADER true);

COPY authors FROM '/tmp/init_data/init_data_authors.csv'
WITH (FORMAT csv, HEADER true);

独特だけど、複雑なことをやってるわけではないので、そういうモンなんだと理解します。
CSVファイルの置き場所は、Dockerfileで指定した場所です。

実行

準備は以上で、あとは実行。ポートを開けるのとVOLUMEでデータを永続化することを忘れずに。

# ビルド
docker build -t mypostgre . --no-cache
# イメージから実行
docker run -p 5432:5432 -v ./mypostgresql_data:/var/lib/postgresql/data mypostgre

無事実行出来たら、ホスト(Windows端末・DockerコマンドをたたいているPC)で、任意のDBクライアントソフトを使って、localhost:5432へ、指定したDB、ユーザー、パスワードで接続すれば確認OKです。プログラムからも接続できます。

まとめ

テーブルを作成するだけでなく、初期データまでインポートする例でした。
Dockerfileでできればdocker-composeもできます。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?