【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メソッドは以下のような定義らしいです。
つまり以下の流れで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の環境構築
この記事が気に入ったらサポートをしてみませんか?