#はじめに
Docker+DjangoにPostgreSQLをセッティングしテストデータを登録します。
OSはmacを使用します。
データベース用のコンテナをアプリケーション本体とは別に起動しdocker-composeで制御します。
本記事はDjangoアプリをDocker上に構築しAWS Fargateにデプロイするプロジェクトの一部です。
#PostgreSQLについて
DjnagoにはデフォルトのデータベースとしてSQLiteが選択されています。しかし、アプリケーションのスケールアウトを考えるとSQLiteではスペック面で物足りません。そこで、スケールアウトに対応できるデータベースであるPostgreSQLを使用します。
PostgreSQLのソースは全て公開されており、用途を問わず無料で利用できます。他の商用/オープンソースのRDBMS製品と比較してもまったく遜色のない、高い性能、機能性、そして信頼性を誇るRDBMSです。
またAWS RDSでもPostgreSQLはサポートされており開発環境からプロダクトション環境まで一貫して使用することが可能です。
#準備
Docker上にDjangoを起動させます。詳細手順については下記リンクを参照ください。
下記リンクで作成したプロジェクトを基に進めて行きます。
docker-compose upを用いてDockerコンテナ上でDjangoを起動する
#管理者権限のあるユーザの作成
create super userコマンドで管理者権限のあるユーザーを作成します。
まずはコンテナを起動します。同じウインドウでコマンドが打てるようデーモン起動します。
デーモン起動の際は-dのオプションコマンンドを使用します。
$ docker-compose up -d
Docker上でコマンドを使用する際はdocker-compose exec webを頭につけます。
webはコンテナ名に置き換えてください。
その後、実行したいコマンドを続けて入力します。python manage.py createsuperuserで管理者権限のあるアカウントを作成できます。
実行するとメールアドレスとパスワードを聞かれるので入力してください。
$ docker-compose exec web python manage.py createsuperuser
その後、コンテナを停止しておきます。
$ docker-compose down
#docker-compose.ymlへのPostgreSQLの追加
docker-compose.ymlにデータベース関連の記述を追加します。
version: '3.7'
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
ports:
- 8000:8000
depends_on: #追加
- db #追加
db: #追加
image: postgres:11 #追加
ビルドします。するとdb用のコンテナが立ち上がることが確認できます。
$ docker-compose up -d --build
...
Creating hello_db_1 ... done #DB
Creating hello_web_1 ... done
#Djangoの設定
デフォルトではsqlite3が設定されています。これをpostgreSQL用に更新します。
#削除
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
#追加
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432
}
}
#Pyscopgのインストール
settings.pyの設定を変更しただけでは動かせません。
postgreSQLとDjangoを繋ぐライブラリであるPyscopgのインストールが必要です。
pipenvを用いてインストールします。
$ docker-compose exec web pipenv install psycopg2-binary==2.8.3
ライブラリをインストールしたので、一度コンテナを停止しビルドします。
その後、 http://127.0.0.1:8000/ へアクセスしwelcomeページが表示されれば設定は完了です。
$ docker-compose down
$ docker-compose up -d --build
#データベースへの接続確認
データベースに変更を加えた際は、migrateコマンドでその都度データベースのマイグレーションが必要になります。マイグレーションしていない状態でデータベースに接続するとProgrammingErrorが起きます。開発をしているとよく出会うエラーですProgrammingErrorの際はデータベース周りをまず疑うのが良いと思います。
$ docker-compose exec web python manage.py migrate
$ docker-compose exec web python manage.py createsuperuser
その後、http://127.0.0.1:8000/admin へアクセスし管理者の名前とパスワードを入力すると管理者ページに入ることができます。
管理者ページでaddボタンを押すと、データベースにGUIからデータの追加等ができます。
#さいごに
Djangoの管理者ページはテストデータの追加時など非常に使い勝手がよいです。
これでDocker+Djangoの環境でPostgreSQLのセッティングができました。