Django

Pythonフレームワーク「Django」を利用してMySQLのテーブルにデータ登録する処理を実装してみた

Django(ジャンゴ)を利用すると、PythonによるWebアプリケーションを作成することができて、データベースへの接続も行うことができる。

今回は、前回の複数画面をもつWebアプリケーションに、MySQLのデータベースのテーブルにユーザー情報を登録する処理を追加してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

Pythonフレームワーク「Django」を利用して複数画面をもつWebアプリケーションを作成してみたDjango(ジャンゴ)を利用すると、PythonによるWebアプリケーションを作成することができる。 今回は、入力画面・確認画面...

また、下記記事に記載されている、MySQLでのスキーマ(データベース)とユーザーの作成が完了していること。

MySQLでユーザーを作成しテーブルを追加してみたMySQLの場合は、Workbenchを利用すると、スキーマ(データベース)やユーザーの作成をGUIベースで実施できる。今回は、Work...

やってみたこと

  1. mysqlclientのインストール
  2. サンプルプログラムの作成
  3. マイグレーションの実行
  4. サンプルプログラムの実行

mysqlclientのインストール

DjangoでMySQLを利用できるようにするには、あらかじめ「mysqlclient」をインストールしておく必要がある。mysqlclientのインストールは、以下のように、コマンドプロンプト「python manage.py runserver」コマンドを実行すればよい。
mysqlclientのインストール

「CODE×CODE」は、需要の高い技術(AWS, Python等)を習得できるプログラミングスクールスクールだった近年、さまざまな会社でクラウド(特にIaaSやPaaSのパブリッククラウド)の需要が非常に高まっていて、クラウドサービスによるシステム開...

サンプルプログラムの作成

作成したサンプルプログラムの構成は、以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。また、「0001_initial.py」はマイグレーション後に作成されるプログラムのため、ここでは赤枠を付与していない。

djangoAppフォルダ下、settings.pyの変更内容は以下の通りで、DB接続設定とDB接続時のログ出力設定を追加している。

# DB接続先をMySQLに変更
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'user01',       # データベース名
        'USER': 'USER01',       # ユーザー名
        'PASSWORD': 'USER01',   # パスワード
        'HOST': 'localhost',    # ホスト名
        'PORT': '3306',         # ポート番号
    }
}

# DB接続時のログ出力設定を追加
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
    },
}

demoフォルダ下、models.pyの内容は以下の通りで、ユーザーデータを登録するテーブル(user_data)の各項目を定義している。また、「__str__」メソッドの追加により、各項目値を文字列で表示できるようにしている。

from django.db import models


class UserData(models.Model):
    """ user_dataテーブルへアクセスするためのモデル """

    # テーブル名を存在するuser_dataテーブルに変更する
    class Meta:
        db_table = 'user_data'

    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=40)
    birth_year = models.IntegerField()
    birth_month = models.IntegerField()
    birth_day = models.IntegerField()
    sex = models.CharField(max_length=1)
    memo = models.CharField(max_length=1024, null=True)

    # print(UserDataオブジェクト)とすることで、UserDataオブジェクトの各値を
    # 文字列で表示できるようにするためのメソッド
    def __str__(self):
        return 'UserData id=' + str(self.id) + ', name=' + str(self.name) \
               + ', birth_year=' + str(self.birth_year) \
               + ', birth_month=' + str(self.birth_month) \
               + ', birth_day=' + str(self.birth_day) \
               + ', sex=' + str(self.sex) + ', memo=' + str(self.memo)

demoフォルダ下、views.pyの内容は以下の通りで、registメソッド内に、画面で入力されたユーザーデータを、user_dataテーブルに追加する処理を記載している。

from django.shortcuts import render
from django.http import HttpResponse
from .forms import InputForm
from .models import UserData
from django.db.models import Max
from datetime import datetime as dt

# クラス定数を定義
SEX_LABEL_IDX = 1  # 性別のラベルを取得するためのインデックス


def index(request):
    """ 入力画面を表示 """
    # 確認画面に渡すフォームを初期化
    params = {
        'input_form': InputForm()
    }
    return render(request, 'demo/input.html', params)


def confirm(request):
    """ 入力画面で確認ボタンが押下された時の処理を定義 """
    # 入力画面でのフォーム値を取得し
    input_form = InputForm(request.POST)

    # フォームの入力チェックを行い、エラーがない場合
    if input_form.is_valid():
        # 確認画面で表示するための入力値(生年月日・性別)の値を生成
        lbl_birth_day = request.POST['birth_day_year'] + '年' \
                        + request.POST['birth_day_month'] + '月' \
                        + request.POST['birth_day_day'] + '日'
        lbl_sex = input_form.sex_data[int(request.POST['sex']) - 1][SEX_LABEL_IDX]

        # 確認画面に渡す各変数を定義
        params = {
            'input_form': input_form,
            'lbl_birth_day': lbl_birth_day,
            'lbl_sex': lbl_sex,
            'lbl_checked': '確認済'
        }
        return render(request, 'demo/confirm.html', params)

    # フォームの入力チェックを行い、エラーがある場合
    else:
        # フォーム値はそのままで入力画面に戻る
        params = {
            'input_form': input_form
        }
        return render(request, 'demo/input.html', params)


def regist(request):
    """ 確認画面でボタンが押下された時の処理を定義 """
    # 送信ボタンが押下された場合
    if "send" in request.POST:
        # USER_DATAテーブルに登録されているidの最大値を取得
        max_id_dict = UserData.objects.all().aggregate(Max('id'))

        # USER_DATAテーブルに入力データを追加
        # USER_DATAテーブルに登録されているデータが無い場合、id=1とする
        id = (max_id_dict['id__max'] or 0) + 1
        name = request.POST['name']
        birth_day_dt = dt.strptime(request.POST['birth_day'], '%Y-%m-%d')
        birth_year = birth_day_dt.year
        birth_month = birth_day_dt.month
        birth_day = birth_day_dt.day
        sex = request.POST['sex']
        # メモは未設定の場合はNULLを設定するようにする
        memo = None if len(request.POST['memo']) == 0 else request.POST['memo']
        user_data = UserData(id=id, name=name, sex=sex, birth_year=birth_year,
                             birth_month=birth_month, birth_day=birth_day, memo=memo)
        user_data.save()
        return render(request, 'demo/complete.html')

    # 戻るボタンが押下された場合
    elif "back" in request.POST:
        # 確認画面でのフォーム値を入力画面に渡す
        input_form = InputForm(request.POST)
        params = {
            'input_form': input_form
        }
        return render(request, 'demo/input.html', params)

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/python/tree/master/django-mysql-regist-user-data/djangoApp

https://www.purin-it.com/doctor-homenet

マイグレーションの実行

Djangoには、マイグレーションという、アプリケーションで使うデータベースの定義を自動的に作成・管理する機能がある。ここでは、マイグレーション機能を利用して、demoフォルダ下、models.pyに定義したテーブル(user_data)を生成してみたので、その手順を共有する。

1) 作成先となるMySQLのデータベースに、user_dataテーブルが既にあれば削除する。
マイグレーションの実行_1

2) コマンドプロンプトでDjangoプロジェクト名のフォルダに移動し、「python manage.py makemigrations (Djangoアプリケーション名)」コマンドを実行して、マイグレーションを行うために必要なマイグレーションファイルの作成を行う。
マイグレーションの実行_2

3) 作成されたマイグレーションファイル(0001_initial.py)の内容は、以下の通り。
マイグレーションの実行_3

# Generated by Django 4.1.1 on 2022-10-02 06:25

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='UserData',
            fields=[
                ('id', models.IntegerField(primary_key=True, serialize=False)),
                ('name', models.CharField(max_length=40)),
                ('birth_year', models.IntegerField()),
                ('birth_month', models.IntegerField()),
                ('birth_day', models.IntegerField()),
                ('sex', models.CharField(max_length=1)),
                ('memo', models.CharField(max_length=1024, null=True)),
            ],
            options={
                'db_table': 'user_data',
            },
        ),
    ]

4) Djangoプロジェクト名のフォルダにいる状態で、コマンドプロンプトで「python manage.py migrate」コマンドを実行して、マイグレーションを実行する。
マイグレーションの実行_4_1

上記コマンドを実行中に、マイグレーションのログが出力される。models.pyに定義したテーブル(user_data)を作成している箇所のログは、以下の通り。
マイグレーションの実行_4_2

5) マイグレーション実行後、以下のように、user_dataテーブルの存在が確認できる。
マイグレーションの実行_5

6) 以下のように、作成されたuser_dataテーブルの定義を確認すると、demoフォルダ下、models.pyに定義した内容の項目が設定されていることが確認できる。
マイグレーションの実行_6_1

マイグレーションの実行_6_2



削除または保存していないWordドキュメントの復元方法【4DDiG Windowsデータ復元】ワード(Word)データ等のファイルを誤って削除してしまった場合は、通常はデータの復元ができませんが、4DDiGというソフトウェアを利用...

サンプルプログラムの実行

サンプルプログラムの実行結果は以下の通りで、画面で入力したユーザーデータがuser_dataテーブルに追加されると共に、実行したSQLがログ出力されることが確認できる。

1) Djangoプロジェクト名のフォルダにいる状態で、コマンドプロンプトで「python manage.py runserver」コマンドを実行して、Webサーバーを起動する。
サンプルプログラムの実行結果_1

2) 以下のように、入力画面で値を設定し確認画面で「送信」ボタンを押下すると、画面で入力したユーザーデータがuser_dataテーブルに追加されることが確認できる。また、このときに追加されたデータのidは1となっている。
サンプルプログラムの実行結果_2_1

サンプルプログラムの実行結果_2_2 サンプルプログラムの実行結果_2_3
select * from user_data
サンプルプログラムの実行結果_2_4

3) 以下のように、入力画面でメモを入力しない場合も、確認画面で「送信」ボタンを押下すると、画面で入力したユーザーデータがuser_dataテーブルに追加されることが確認できる。また、このときに追加されたデータのidは2(登録済のidの最大値+1)となっている。
サンプルプログラムの実行結果_3_1

サンプルプログラムの実行結果_3_2 サンプルプログラムの実行結果_3_3
select * from user_data
サンプルプログラムの実行結果_3_4

4) このときのコンソールログを確認すると、以下の赤枠のように、SQLの実行ログが出力されていることが確認できる。
サンプルプログラムの実行結果_4

要点まとめ

  • Pythonフレームワーク「Django」で利用するデータベース接続先は、作成したDjangoプロジェクト内のsettings.pyに定義する。
  • Djangoで「MySQL」を利用できるようにするには、あらかじめ「mysqlclient」をインストールしておく必要がある。
  • DBに接続して使用するテーブルの各項目は、作成したDjangoアプリケーション内のmodels.pyに定義する。
  • データベースマイグレーションを実行することで、models.pyに定義したテーブルを自動生成できる。