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_age600 に設定すると、接続を最大で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    |                |
+--------------+--------------+------+-----+---------+----------------+

パスワードはハッシュ化されて保存されているようだった。

コメントを残す

python

前の記事

Flaskによるログイン認証