djangoにMysqlを紐づける
Djangoにはsqlite3がついているが、Mysqlと紐づけたい場合の手順についてのメモ
スタートプロジェクトに移動し、以下2つを実行
pip install dj-database-url
dj-database-url
はDjangoアプリケーションでデータベース接続設定を簡単に管理するためのライブラリです。具体的には、Djangoの設定ファイルである settings.py
内でデータベースの接続情報を簡潔に設定し、環境変数から接続情報を読み取ることができるようにします。
pip install python-dotenv
python-dotenv
はPythonアプリケーションで環境変数を管理するためのライブラリです。環境変数はアプリケーションの設定や構成情報を外部に保存し、アプリケーションの動作をカスタマイズするために一般的に使用されます。python-dotenv
を使用することで、アプリケーションの環境変数をファイルに保存し、簡単に読み込むことができます。
続いて、setting.pyのDATABASEの記述を、以下の内容に置き換える。
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),
}
すでに記述のある部分は、sqlite3の記述なので消した方がよいでしょう。
DATABASES
設定内の conn_max_age
オプションを設定することによって、Djangoアプリケーションのデータベース接続のパフォーマンスが向上する可能性があります。具体的には、このオプションはデータベース接続の再利用を管理し、アプリケーションの応答時間を向上させるのに役立ちます。
conn_max_age
オプションは、データベース接続をプール内に保持する時間(秒単位)を指定します。デフォルトでは、Djangoは各リクエストのたびにデータベース接続を確立し、リクエストが完了すると接続を閉じます。しかし、これはデータベース接続のオーバーヘッドが高く、特に多数のリクエストが続く場合には効率が悪いことがあります。
conn_max_age
を設定することで、接続を再利用することができ、新しい接続を確立するためのオーバーヘッドを減少させることができます。たとえば、conn_max_age
を 600
に設定すると、接続を最大で10分間保持し、その間に発生したリクエストで再利用します。これにより、データベース接続の確立回数が減少し、アプリケーションの応答時間が向上します。
ただし、conn_max_age
を設定する際には、サーバーのリソース(特にデータベース接続のプールサイズ)やアプリケーションの要件に合わせて適切な値を選択することが重要です。過度に長い期間を設定すると、データベース接続のリソースが過度に消費される可能性があるため、バランスを取る必要があります。
続いて、コマンドラインツール上でmysqlclientをインストール
pip install mysqlclient
インストールしたmysqlはすでにパスワード設定を行っているため、以下のように記述。
mysql -u root -p
パスワードを設定していない場合はmysql -u rootとする。
設定したパスワードにてmysqlの対話モードになればよい。
create database (テーブル名);
スーパーユーザー用のテーブルを作成し、exitで退出。
この段階では作るだけでよい。
プロジェクト直下に.envというファイルを作成し、中には以下のように記述
DATABASE_URL=mysql://root:(パスワード)@localhost/(プロジェクトファイル名)
続いてマイグレートをした後、実行結果として以下のような記述がでれば成功となる。
python manage.py migrate
#以下のような実行結果が出ればOK
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
続いて、スーパーユーザーを設定
python manage.py createsuperuser
IDとメールアドレス(任意)、パスワードをそれぞれ設定し、サーバーを起動
python manage.py runserver
通常通りhttp://127.0.0.1:8000/でロケットのイラストがでればOKで、/adminにて先ほど設定したIDとパスワードでログイン
成功すれば、Mysqlとの連携は完了と見てよいだろう。
また、Mysqlのスキーマ情報は、以下のようになっているようだ。
作成したテーブルを参照してみた結果。
mysql> show tables;
+----------------------------+
| Tables_in_(データベース名) |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
通常はこの中のテーブル、auth_userにスーパーユーザーの情報が格納されているようです。
スキーマ情報を見てみましょう。
mysql> SHOW COLUMNS FROM `auth_user`;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| password | varchar(128) | NO | | NULL | |
| last_login | datetime(6) | YES | | NULL | |
| is_superuser | tinyint(1) | NO | | NULL | |
| username | varchar(150) | NO | UNI | NULL | |
| first_name | varchar(150) | NO | | NULL | |
| last_name | varchar(150) | NO | | NULL | |
| email | varchar(254) | NO | | NULL | |
| is_staff | tinyint(1) | NO | | NULL | |
| is_active | tinyint(1) | NO | | NULL | |
| date_joined | datetime(6) | NO | | NULL | |
+--------------+--------------+------+-----+---------+----------------+
パスワードはハッシュ化されて保存されているようだった。