Django(ジャンゴ)を利用すると、PythonによるWebアプリケーションを作成することができて、データベースへの接続も行うことができる。
今回は、前回の複数画面をもつWebアプリケーションに、MySQLのデータベースのテーブルにユーザー情報を登録する処理を追加してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の実装が完了していること。
また、下記記事に記載されている、MySQLでのスキーマ(データベース)とユーザーの作成が完了していること。
やってみたこと
mysqlclientのインストール
DjangoでMySQLを利用できるようにするには、あらかじめ「mysqlclient」をインストールしておく必要がある。mysqlclientのインストールは、以下のように、コマンドプロンプト「python manage.py runserver」コマンドを実行すればよい。
サンプルプログラムの作成
作成したサンプルプログラムの構成は、以下の通り。
なお、上記の赤枠は、前提条件のプログラムから追加・変更したプログラムである。また、「0001_initial.py」はマイグレーション後に作成されるプログラムのため、ここでは赤枠を付与していない。
djangoAppフォルダ下、settings.pyの変更内容は以下の通りで、DB接続設定とDB接続時のログ出力設定を追加している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 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__」メソッドの追加により、各項目値を文字列で表示できるようにしている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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テーブルに追加する処理を記載している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | 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テーブルが既にあれば削除する。
2) コマンドプロンプトでDjangoプロジェクト名のフォルダに移動し、「python manage.py makemigrations (Djangoアプリケーション名)」コマンドを実行して、マイグレーションを行うために必要なマイグレーションファイルの作成を行う。
3) 作成されたマイグレーションファイル(0001_initial.py)の内容は、以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # 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」コマンドを実行して、マイグレーションを実行する。
上記コマンドを実行中に、マイグレーションのログが出力される。models.pyに定義したテーブル(user_data)を作成している箇所のログは、以下の通り。
5) マイグレーション実行後、以下のように、user_dataテーブルの存在が確認できる。
6) 以下のように、作成されたuser_dataテーブルの定義を確認すると、demoフォルダ下、models.pyに定義した内容の項目が設定されていることが確認できる。
サンプルプログラムの実行
サンプルプログラムの実行結果は以下の通りで、画面で入力したユーザーデータがuser_dataテーブルに追加されると共に、実行したSQLがログ出力されることが確認できる。
1) Djangoプロジェクト名のフォルダにいる状態で、コマンドプロンプトで「python manage.py runserver」コマンドを実行して、Webサーバーを起動する。
2) 以下のように、入力画面で値を設定し確認画面で「送信」ボタンを押下すると、画面で入力したユーザーデータがuser_dataテーブルに追加されることが確認できる。また、このときに追加されたデータのidは1となっている。
1 | select * from user_data |
3) 以下のように、入力画面でメモを入力しない場合も、確認画面で「送信」ボタンを押下すると、画面で入力したユーザーデータがuser_dataテーブルに追加されることが確認できる。また、このときに追加されたデータのidは2(登録済のidの最大値+1)となっている。
1 | select * from user_data |
4) このときのコンソールログを確認すると、以下の赤枠のように、SQLの実行ログが出力されていることが確認できる。
要点まとめ
- Pythonフレームワーク「Django」で利用するデータベース接続先は、作成したDjangoプロジェクト内のsettings.pyに定義する。
- Djangoで「MySQL」を利用できるようにするには、あらかじめ「mysqlclient」をインストールしておく必要がある。
- DBに接続して使用するテーブルの各項目は、作成したDjangoアプリケーション内のmodels.pyに定義する。
- データベースマイグレーションを実行することで、models.pyに定義したテーブルを自動生成できる。