search
LoginSignup
18

More than 1 year has passed since last update.

posted at

updated at

Organization

Docker+DjangoでPostgreSQLを使う

はじめに

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にデータベース関連の記述を追加します。

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用に更新します。

hello_project/settings.py
#削除
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のセッティングができました。

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
What you can do with signing up
18