DjangoからPostgreSQLに接続する

この記事ではDjangoからPostgreSQLに接続する設定方法を紹介します。
結論を先に書くと、pipenv install psycopg2-binaryでPsycopgをインストールして、プロジェクトのsettings.pyに以下のように書きます。

# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432
    }
}

Djangoはデフォルトではローカル環境にあるSQLiteに接続するよう設定されていますが、それをPostgreSQLに接続するようにコードを書いていく手順を順番に紹介していきます。

まずはサンプルプロジェクトを作るところから始めましょう。

Djangoプロジェクトを作成する

サンプルプロジェクト用のディレクトリを作成します。

% mkdir postgresql; cd postgresql

プロジェクトディレクトリにDjangoをインストールして、仮想環境をアクティベートします。
Djangoプロジェクトを作って、マイグレーションを実行し、仮想環境から抜けます。

% pipenv install django==3.0.1
% pipenv shell
% django-admin startproject postgresql_project .
% python manage.py migrate
% exit

次にDocker環境を構築していきます。

% touch Dockerfile
% touch docker-compose.yml

Dockerfileには以下のように書きます。

FROM python:3.7

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code

COPY Pipfile Pipfile.lock /code/
RUN pip install pipenv && pipenv install --system

COPY . /code/

Dockerイメージをビルドするために、docker build .コマンドを実行しましょう。

docker build .

次にdocker-compose.ymlを編集します。

version: '3.7'

services:
  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - 8000:8000

デタッチモードでDockerを起動します。

% docker-compose up -d

次にDjangoプロジェクトの管理者ユーザーを作ります。

% docker-compose exec web python manage.py createsueruser

http://127.0.0.1:8000/admin/にアクセスすることで管理者としてログインできます。

管理者でログインできることを確認したら、docker-compose downでDockerを落としておきましょう。

これで基本の準備は完了しました。
次からはDocker環境にPostgreSQLをインストールして、PostgreSQLに接続する準備をしていきます。

Docker環境にPostgreSQLをインストールする

PostgreSQLをインストールするために、docker-compose.ymlを以下のように編集します。

version: '3.7'

services:
  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - 8000:8000
    depends_on:
      - db

  db:
    image: postgres:11
    environment:
      - "POSTGRES_HOST_AUTH_METHOD=trust"

docker-compose.ymlを編集した後、docker-compose up -dでイメージを再度ビルドしましょう。

% docker-compose up -d 

Djangoの設定ファイルを編集してPostgreSQLに接続する

プロジェクトのsettings.pyを編集します。
修正するのはpostgresql_project/settings.py(プロジェクトレベルの設定ファイル)のDATABASESです。

デフォルトではローカルのSQLiteに接続するように設定されています。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

PostgreSQLに接続するために、以下のように編集します。

# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432
    }
}

が、これだけではまだ動きません。
docker-compose logsコマンドを打ってログを見ると、「Psycopgがない」というエラーが出ています。

% docker-compose logs

 django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: No module named 'psycopg2'

Psycopgとは、Pythonで人気のデータベースアダプタです。
JavaでいうJDBCのようなものです。Psycopgがないため、ここでDBに接続できずにエラーが出ていました。

PipenvでPyscopgをインストールしましょう。

% docker-compose exec web pipenv install psycopg2-binary  

ただ、僕の環境ではPythonのバージョン3.6が使われていたため、以下のような警告が出てインストールできませんでした。

Warning: Python 3.6 was not found on your system…
You can specify specific versions of Python with:
  $ pipenv --python path/to/python

このエラーに対応するためには、Pipfile.lockのpython_versionを3.6から"python_version": "3.7"に変更し、Pipfileも同じようにpython_version = "3.7"に変更すればOKです。

これでインストールに成功しました。

Pyscopgのインストールに成功した場合は以下のようなログが出力されます。

✔ Success! 
Updated Pipfile.lock (6d5838)!
Installing dependencies from Pipfile.lock (6d5838)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 — 00:00:23
To activate this project's virtualenv, run pipenv shell.

Psycopgのインストールが終わった後で、Dockerを再起動しましょう。

% docker-compose down
% docker-compose up -d --build

それからhttp://127.0.0.1:8000/を開くと、Djangoのウェルカム画面が開けます。

無事にPostgreSQLに接続できていることがわかります。

画面が開けることを確認したら、マイグレーションを実行します。

% docker-compose exec web python manage.py migrate

マイグレーションが完了したらもう一度管理者ユーザーを作りましょう。

% docker-compose exec web python manage.py createsuperuser

管理者ユーザーでもログインできるはずです。
管理者画面ではPostgreSQLにユーザーが登録されていることが確認できます。

全ての作業が終わったらdocker-compose downでDockerを停止します。

% docker-compose down

お疲れさまでした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です