この記事では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
お疲れさまでした。
コメントを残す