資産記録アプリ開発②~DB作成~
環境
Docker、docker-compose以前入れた物なのでバージョンは少し古めです。
OS:Windows 11 Home(21H2)
Docker:version 20.10.2, build 2291f61
docker-compose: version 1.27.4, build 40524192
Python: 3.8
MySQL環境構築
MySQLは最新版ではなく5.7を使用します。 ついでにGUIで色々出来るようにphpMyAdminもインストールしておきます。
この2つをdocker-composeを使って構築していきます。
まずはdocker-compose.yamlを作成します。
version: '3'services:mysqldb:image: mysql:5.7container_name: mysql57_containerenvironment:MYSQL_ROOT_PASSWORD: rootMYSQL_DATABASE: moneyTZ: 'Asia/Tokyo'volumes:- ./docker/db/data:/var/lib/mysql- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf- ./docker/db/sql:/docker-entrypoint-initdb.dports:- "3306:3306"command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ciphpmyadmin:image: phpmyadmin/phpmyadmindepends_on:- mysqldbenvironment:- PMA_ARBITRARY=1- PMA_HOSTS='mysqldb'ports:- "8000:80"volumes:- ./docker/phpmyadmin/sessions:/sessions
データ永続化などを考慮した作りにしておきます。
合わせて下記の様なフォルダを作成しておきます。
D:mysql├─docker-compose.yml│└─docker├─db│ ├─my.cnf│ ││ ├─data│ ││ └─sql└─phpmyadmin└─sessions
準備が出来たら立ち上げます。
docker-compose up
「http://localhost:8000」へアクセスし、下記の様な画面が表示されログインできれば、立ち上げ成功です。
テーブル作成
まずは以前の手順を参考にDjangoの環境を構築します。
conda create -n assetmanagement python=3.8conda activate assetmanagementconda install -c conda-forge djangodjango-admin startproject AssetManagement
参考:
Djangoを使ってみる①(環境構築~プロジェクト作成)
Djangoを使ってみる②(アプリケーションの作成)
Djangoを使ってみる④(Modelの作成~管理画面の使用)
下記の様なファイルが生成されます。
今回はわかりやすいように「settings.py」等が入っているフォルダを「config」という名前に変更しておきます。
「manage.py」「settings.py」の修正が必要なのでプロジェクト内を「AssetManagement」で検索して全て「config」に修正します。
続いて、アプリを作成します。ついでにMySQLを使用するためのライブラリもインストールしておきます。
python manage.py startapp asset_managementpip install mysqlclient
次にテーブルを作成するためにモデルの定義を行います。
今回は資産総額管理画面のためのモデルだけ作成します。
「asset_management\models.py」を下記のように編集します。
from django.db import modelsclass AppMaster(models.Model):name = models.CharField(max_length=128, unique=True)class Asset(models.Model):created_at = models.DateField()asset_amount = models.IntegerField()diff = models.IntegerField()diff_rate = models.FloatField()managed_app = models.ForeignKey(AppMaster, on_delete=models.CASCADE, related_name='asett_app')memo = models.CharField(max_length=256, null=True, blank=True)
Djangoはデフォルトではsqliteを使用する設定になっているため、settings.pyを下記のように修正し、MySQLに接続するようにします。
今回は環境変数から値を読み取る様記載しました。
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': os.environ['DBNAME'],'USER': os.environ['DBUSER'],'PASSWORD': os.environ['DBPASSWORD'],'HOST': os.environ['DBHOST'],'PORT': os.environ['DBPORT'],}}
環境変数設定例 :
変数名 | 値 |
---|---|
DBNAME | money |
DBUSER | root |
DBPASSWORD | root |
DBHOST | 127.0.0.1 |
DBPORT | 3306 |
その他、エラーが出ない様settings.pyやuils.pyを修正しておきましょう。
環境が整ったら、マイグレーションを行います。
python manage.py makemigrationspython manage.py migrate
マイグレーションが成功後、再度phpMyAdminへアクセスすると下記のようにテーブルが作成されています。