そんな方向けの記事になります。

Python(Django)とデータベースを接続してデータベースを扱えるようにするというのは、
実装をはじめる上で誰しもが通る道だと思います。

私も5年以上プログラマやリーダーとしてWEB開発に携わっていますが、
WEB開発でデータベースを使用しないプロジェクトはありませんでした。

Javaなどでデータベースを使用するときは、
接続用のドライバをWEBサーバに配置して、、、など、

データベースを使用するまでの環境構築に時間がかかり、なかなか開発に進めないということがありました。

Python(django)では、接続するためのドライバを配置するということはありませんが、いくつかお決まりの手順を踏む必要があります。

今回は、djangoとpostgresqlのDB接続までの手順をわかりやすく解説していきたいと思います。

本記事の目的

今回の記事では、
「Windows上で最小構成でdjangoを使用してデータベース(postgresql)に接続し、 データ登録・取得を行うこと」
を目的とします。

私のマシンで実際に実行して出来た操作なので、
基本的にはコピペすることで、実際に動くところまでできると思います。

実行環境(前提条件)

実行時にハマった点

実際の手順を紹介する前に、私がマシン上で実際に試してみたときにハマった罠を紹介します。

1.PyCharm上で仮想環境を作成すると、pipがうまくインストールされず、仮想環境上のPythonやdjangoを使用できない

Pythonの仮想環境を作ろうとしたときに、単純にPyCharmで「ファイル」→「新規プロジェクト」で以下のような画面が出て新規プロジェクト(仮想環境)を作成できます。

私も何も疑わず、PJを作成しました。。ですが

PyCharm上で作成したプロジェクト(仮想環境)はなぜかpipがインストールされず、ターミナルからpipを実行しようとしても「そんなコマンドはありません」と言われ実行できなかったのです!

原因は全くわかりませんでしたが、、、解決策はわかりました。

単純ですが、仮想環境の作成をコマンドプロンプトから実行することで解決しました。

やり方は実施手順で解説します。

仮想環境の作成(venv)はコマンドプロンプトから実行することを覚えておいてください。

Python3.8.2を使用すると、postgresql接続用ライブラリ(psycopg2)が使用できない

記事を書いた2020/2/9時点ですが、Python3.8.2を使用する場合、postgresql接続用ライブラリが使用できない問題がありました。

Pythonを3.7.6にダウングレードすることで解決しました。

ダウングレード方法は、単純にPythonの3.8をアンインストール後、3.7.6をインストールし直しました。

今後postgresql接続用ライブラリ(psycopg2)がPython3.8に対応してくれるかどうかわかりませんが、バージョンによって使用できなくなる可能性があることに注意してください。

実施手順(djangoとpostgresql接続)

では、実際の手順を紹介していきます。

コマンドについては、コマンドプロンプトから実行してください。

postgresqlのデータベース作成、接続設定(Windowsローカル)

postgresqlのインストールは終わっている前提で、postgresqlを使えるようにする状態にするための手順を解説していきます。

環境変数の設定

環境変数を忘れずに設定しておきましょう

私の場合は以下のパスを、PCの環境変数の「Path」に追加しました。

「C:\Program Files\PostgreSQL\12\bin」

postgresql起動

postgresqlを起動します。

  pg_ctl start -D C:\[データのパス]\data

このようなログが出ていれば、起動成功です。

DB作成(createdb)

DBを作成します。

  createdb djangoapp -U postgres

ここでは仮に「djangoapp」というDBを作成しています。

ユーザ、スキーマの登録、スキーマとの関連付け

ユーザとスキーマを作成します。

  CREATE ROLE django WITH LOGIN PASSWORD 'django';
  alter role django WITH LOGIN PASSWORD 'django';
  alter role django with superuser; 

ここでは仮に「djangoユーザ」を作成し、 「djangoユーザ」に「django」というパスワードを設定し、スーパユーザ権限(管理者権限)を設定しました。

ユーザ・スキーマ・スキーマ・パスワードの名称は任意ですので自由に設定してください。

ログイン

次はログインします。

コマンドプロンプト上で以下のようにコマンドプロンプトからコマンドを実行し、ログインしてみてください。

  psql -U [ユーザ名] [DB名]

このように「djangoapp」DBにログインすることができると思います。

スキーマ作成

スキーマを作成します。

スキーマは、DB内に作成するもので、作成しないとデフォルトの「public」スキーマが使用されますが、今回はあえて自分用のスキーマを作成しています。

  CREATE SCHEMA django AUTHORIZATION django; 

「djangoスキーマ」を作成し「djangoユーザ」の持ちものであることを定義しています。

以上でpostgresql側の前準備は終了です。

次はPython側の設定となります。

仮想環境作成★コマンドプロンプトから実行すること!

  cd [PJを作成したいディレクトリパス]
  python -m venv [PJ名]

[PJ名]に指定したプロジェクトができます。

PyCharmでプロジェクトを開く

左上のファイル→開くで作成したPJのディレクトリパスを指定し、PJを開きます。

このとき、Pythonのインタプリターの指定ができていないと思うので「ファイル」→「設定」→「プロジェクト」→「プロジェクト・インタープリター」内の、「No Interpreter右側のボタン」→「追加」で新しい環境を指定し、OKとしましょう。

※インタプリターとはプログラミング言語を解釈するプログラムのことで、今回であれば仮想環境内のpython.exeがプログラミング言語を解釈するように設定します。

私のマシンの場合、以下のフォルダに指定しました。

  • ロケーション: C:\ [PJディレクトリパス]\venv
  • ベースインタープリタ:「C:\Users\[ユーザ名]\AppData\Local\Programs\Python\Python37\python.exe」

Pythonライブラリのインストール

以下のライブラリをプロジェクトインタープリターでインストールしてください

※ライブラリのインストールは、PyCharmからのインストールで問題ありませんでした

  • Django
  • psycopg2
  • psycopg2-binary

先程の「プロジェクト・インタープリター」内の、 「+」から、上記のライブラリのインストールを行ってください。

ライブラリ名で検索後、「パッケージのインストール」でインストールが行なえます。

ここで画面左下のターミナルを開き、djangoが使用できるかを確認しましょう。

画面左下の「ターミナル」を開き、

django-admin

と入力し、Enterを押してみてください。

以下のように、コマンド引数が足りませんよというエラーが出ていれば、うまく出来ています。

「コマンドが見つかりません」などのエラーが出る場合、1,2の設定が出来ていない可能性が高いです。見直してみましょう。

DjangoPJ作成

先程のターミナルから、「django-admin」コマンドを使用し、仮想環境内にdjango用のPJを作成しましょう。

先程プロジェクトを一度作成したのでは?と思った方は鋭いです。

先程は、PythonのPJ(仮想環境)を作成しましたが、今回はDjango用のプロジェクトを作成します。

DjangoはWEB開発用のプロジェクトで中身が異なってきます。

注意点は、先程作成したPythonプロジェクトの中にDjangoプロジェクトを作成することです!

  cd [DjangoPJを作成したいディレクトリパス]
  django-admin startproject [DjangoPJ名]

ソース作成

少し種類が多いですが以下のソースを作成してください。

models.py

DBのテーブル構成を定義します。

このOyaクラスの場合、「id」を主キーにし、「name」と「addr」という項目があるテーブルを定義しています。

from django.db import models

class Oya(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=10)
    addr = models.CharField(max_length=1024)

forms.py

入力フォームを定義します。

今回は、「name」と「addr」を入力できるフォームを定義します。

from django.forms import Form, CharField


class OyaForm(Form):
    name = CharField(max_length=10)
    addr = CharField(max_length=1024)

views.py

実際の処理を組み込みます。

今回は以下の動きになるように実装しています。

  • 「/」ディレクトリにアクセスした場合、DBテーブルより情報をすべて取得し、index.htmlに取得した情報を渡す。(index.html内に渡した情報が表示される)
  • 「/form」ディレクトリにアクセスした場合、入力フォームクラス(forms.py内OyaForm)を取得し、入力フォームを表示する(form.htmlを表示)
  • 入力フォームから「送信」ボタンを押下した場合、入力した情報をDBに登録し、登録情報も含めてDBの情報を再度取得し、index.htmlを表示します。
from django.shortcuts import render, redirect
from .forms import OyaForm
from .models import Oya

def index(request):
    oyas = Oya.objects.all()
    return render(request,  'index.html', {'oyas': oyas})

def form(request):
    form = OyaForm()
    return render(request, 'form.html', {'form': form})

def post(request):
    if request.method != 'POST':
        return redirect(to="/form")
    form = OyaForm(request.POST)
    if form.is_valid():
        oya = Oya.objects.create(
            name = request.POST['name'],
            addr = request.POST['addr']
        )
        oya.save()
        return redirect(to='/')
    else:
        return redirect(to="/form")

urls.py

URLのパス指定の紐付けをここで行います。

from django.contrib import admin
from django.urls import path,include

from . import views

urlpatterns = [
    path('', views.index),
    path('form', views.form),
    path('post', views.post),
    path('admin/', admin.site.urls)

settings.py

以下の設定を行ってください。

  • INSTALLED_APPSにプロジェクトの追加
  • DIRSに使用ディレクトリの追加。(templatesディレクトリを追加する)
  • postgresqlの使用設定
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'DjangoPJ名', # 追加
]
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, "templates"), # 追加
                ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'djangoapp',
        'USER': 'django',
        'PASSWORD': 'django',
        'HOST': 'localhost',
        'PORT': 5432
    }
}

index.html/form.html

画面構成定義用のHTMLを定義します。

HTML内の{%%}や {{}}で囲まれた部分はpythonコードが入力できる箇所です。

細かい説明は省きますが、HTMLを表示する際に引数で指定したpythonの変数がここで使用でき、画面に情報を表示することが出来ます。

<!doctype html>
<html>
<head>
    <meta charset="utf-8"/>
</head>
<body>
<table class="table">
    <thead>
    <tr>
        <th scope="col"></th>
        <th scope="col">名前</th>
        <th scope="col">住所</th>
    </tr>
    </thead>
    <tbody>
	{% for oya in oyas %}
    <tr>
        <th scope="row">{{ forloop.counter }}</th>
        <td>{{ oya.name }}</td>
        <td>{{ oya.addr }}</td>
	</tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/post" method="post">
    {% csrf_token %}
    {{ form }}
    <button type="submit">送信</button>
</form>
</body>
</html>

マイグレーション実行

ソースが作成出来たら、DBと接続し、Pythonで定義したテーブルの情報をDBに連携する必要があります。

これをマイグレーションといいます。

Python内でのDB定義(今回であればmodels.py)の定義が変わればその都度マイグレーションが必要になります。

makemigrations

ターミナル上で「manage.py」があるフォルダまで移動後、

以下のコマンドを実行してください。

 python manage.py makemigrations [DjangoPJ名]
 
 <実行結果> 
 Migrations for 'DjangoPJ名':
   DjangoPJ名\migrations\0001_initial.py
     - Create model Oya

migrate

 python manage.py migrate
 
 <実行結果>
 Operations to perform:
   Apply all migrations: admin, auth, contenttypes, PJ名, sessions
 Running migrations:
   Applying contenttypes.0001_initial... OK
   Applying auth.0001_initial... OK
   Applying admin.0001_initial... OK
   Applying admin.0002_logentry_remove_auto_add... OK
   Applying admin.0003_logentry_add_action_flag_choices... OK
   Applying contenttypes.0002_remove_content_type_name... OK
   Applying auth.0002_alter_permission_name_max_length... OK
   Applying auth.0003_alter_user_email_max_length... OK
   Applying auth.0004_alter_user_username_opts... OK
   Applying auth.0005_alter_user_last_login_null... OK
   Applying auth.0006_require_contenttypes_0002... OK
   Applying auth.0007_alter_validators_add_error_messages... OK
   Applying auth.0008_alter_user_username_max_length... OK
   Applying auth.0009_alter_user_last_name_max_length... OK
   Applying auth.0010_alter_group_name_max_length... OK
   Applying auth.0011_update_proxy_permissions... OK
   Applying oruoru.0001_initial... OK
   Applying sessions.0001_initial... OK

これで、DBとの連携が完了しました。

以上で、プログラムの作成は完了となります。

では実際に動かしてみましょう。

確認方法

PyCharmのrunserver

Pycharmの左側の「manage.py」を右クリックし、「’manage.py ‘ の編集」をクリックしてください。

「名前」と「パラメータ」のところに「runserver」を入力し、OK

これにより右上の▷が押せるようになっているので押してください。

コンソール上に以下の実行結果が出てくれば起動成功です。

URLアクセス

次のような画面が出れば成功です!

情報登録→「 http://127.0.0.1:8000/form 」

NameとAddrに文字を入力し、「送信ボタン」で情報を登録できます。

情報表示→「 http://127.0.0.1:8000/ 」

情報を表示できます。

以上、postgresqlを使用するための、django(python)の最低限の設定と実装でした。