見出し画像

【73日目】DjangoとMySQLの接続_プログラミング学び日記

 このnoteは、31歳未経験からエンジニアを目指して勉強していく記録を綴っているものです。現在はAdTechでカスタマーサクセスを担当しつつ、色んなチャンスに恵まれ、CS業務や子育てと並行しながらチャレンジしています。

 これからプログラミングを始める方にとってのTipsやモチベアップに繋げられるように頑張りたいと思っています。
--------------------------------------------


本日はYouTubeのチュートリアルを進めて、DjangoとMySQLを接続する方法について学びました。以前に見たことある動画ですが、ローカルの環境でやってみるのは今回が初めてでした。


環境

エディタはVSCode
Python 3.10.1
Django 3.2.8
MySQL 5.6.34(MAMPを使用)

事前準備

MySQLで必要になるライブラリを2つインストールします。

・dj-database-url:データベースの接続設定が1行で書けるライブラリ
・python-dotenv:「.env」という環境設定ファイルでプロジェクトの設定ができるライブラリ
・mysqlclient:MySQL用のライブラリ

pip install dj-database-url
pip install python-dotenv
pip install mysqlclient


MySQL上にプロジェクト用のデータベースを作る

ターミナルからMySQLにログインして、通常通りデータベースを作成すればOKです。

mysql -u root -pパスワード
 
CREATE DATABASE データベース名;

データベースを作ったらexitでログアウトします。


環境設定ファイルを設置(.env)

Djangoではこれが最も大事らしいです。MySQLに接続するにはユーザー名やパスワードが必要ですが、プロジェクトのsettings.pyにそれを記載してしまうと、GitHubにプッシュした際など、外部に漏れてしまう可能性があります。

そのため「.env」のような隠しファイルで環境設定して、そこから参照するような流れにすることでIDやパスワードを守ります。ファイルを作る場所はプロジェクト直下で、ファイル名は「.env」です。ファイルには以下の内容を入力します。

DATABASE_URL=mysql://ユーザー名:パスワード@localhost/データベース名

例えば以下なら、「mysqlのpj_dbというデータベースにrootユーザーでpasswordというパスワードでアクセスする」という意味になります。

DATABASE_URL=mysql://root:password@localhost/pj_db


全体設定のsettings.pyを編集

DATABASESの欄を削除して以下のように追記します。

import dj_database_url
from dotenv import (
    find_dotenv,
    load_dotenv,
)

load_dotenv(find_dotenv())
DATABASES = {
    'default': dj_database_url.config(conn_max_age=600),
    # conn_max_ageはデータベースへの接続速度を速くするための設定。60秒までしかデータベースに接続しないよ、という意味。 
}

以下の流れになっています。
①load_dotenv(find_dotenv())で.envを見つけて読み込む
②読み込んだものをdj_database.urlでデータベースとしてセットアップ

上記の記述方法でも動作しましたが、自分の環境では1つWarningが出ました。

WARNINGS:
?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
mended you activate it. See: https://docs.djangoproject.com/en/3.2/ref/databases/#mysql-sql-mode

データベースを守るため、データベースの編集には一定の制限をかけた方がよい、という警告みたいです。

色々調べると、DATABASESの'default'の設定のうち、OPTIONSに「sql_mode='STRICT_TRANS_TABLES'」という属性を付与すれば良いみたいです。

・・・どうやって付与する?? →苦労して見つけました。

まず、DATABASESのdefaultに含まれる属性をまじめに表示すると以下です。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
        'OPTIONS': ''
    }
}

OPTIONSがありましたね!
ここに辞書型で入力すればOKです。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
        'OPTIONS': {'sql_mode': 'STRICT_TRANS_TABLES',}
    }
}

あとは「.env」ファイルと結びつける必要があります。

db_from_env = dj_database_url.config() 
DATABASES['default'].update(db_from_env)  # ここを削除すると「'No database selected'」というエラーが出る

dj_database_url.configメソッドは以下のような定義らしいです。

dj_database_url.configメソッドは、URLで指定されたすべてのデータが入力されたDjangoデータベース接続ディクショナリを返します。Djangoの接続プールを簡単に有効にするconn_max_age引数もあります。

https://pythonrepo.com/repo/jacobian-dj-database-url-python-django-utilities

つまり以下の流れでOPTIONS属性を付与しています。
①defaultのOPTIONSに要素を付与
②dj_database_url.config()でデータベースを呼び出し(.envより)
③update()で、②に含まれる属性を上書き
 →「OPTIONS」は②に含まれないため上書きされないで残る

気が付きにくかったのですが、「update(db_from_env)」はPythonのupdateメソッドのことです。辞書の内容を更新するためのメソッドですね。


接続確認

以下を実行してみて、

python manage.py migrate

以下のように15行くらいのOKが出れば成功です。


また、管理ユーザーを作ってそれが正しく表示されるかどうかも試してみます。

python manage.py createsuperuser

この後にトップ画面のURLに「/admin」を足して管理画面に入って、追加したユーザーが表示されていれば確認完了です。


これでMySQLとの接続は完了です!


参考


これまで修了したコース等

【YouTube動画】
Pythonでウェブサービスを作ろう! #1
テンプレートをマスターしよう! #2
静的ファイルを配信しよう !#3
本番公開しよう! #4
データベースと接続しよう! #5

【Paiza】
Aランクレベルアップメニュー 24/49問
ループメニュー1              20/20問
ループメニュー2              12/20問
配列メニュー      51/64問
条件分岐メニュー    25/25問
二重ループメニュー   19/19問
配列活用メニュー    26/26問
文字列処理メニュー   30/30問
Bランクレベルアップメニュー 62/62問
Cランクレベルアップメニュー 30/30問
ランクB合格
ランクC合格

【書籍/ブログ】
Django入門 | 初心者でも1時間でWebアプリ(Todoアプリ)を作成するコース
基礎からのMySQL     514/514頁
Web技術の基本      189/189頁 ※2周目中
京大のPython教科書    116/201頁
Pythonデータベースプログラミング 194/194頁
Pythonエンジニアファーストブック読了

【Progate】
Python Ⅰ~Ⅴ
Python アプリ版 コースⅠ~Ⅴ
SQL Ⅰ~ Ⅳ
SQL アプリ版 コースⅢ
HTML&CSS 初級編

【その他】
Pythonの環境構築
VSCodeの環境構築
MySQLの環境構築(MAMP)
Git / GitHubの環境構築
HEROKUの環境構築

この記事が気に入ったらサポートをしてみませんか?