2024年1月18日木曜日

Django で MySQL を使う

Django で MySQL を使う

概要

前回作ったチュートリアルアプリは SQLite で動作していました
今回は MySQL に切り替えてみたいと思います

環境

  • macOS 11.7.10
  • Python 3.11.6
  • Django 5.0.1
  • MySQL 8.1.0

データベース作成

  • create database django_test;

settings.py の編集

ドライバは PyMySQL を使います
公式おすすは mysqlclient のようです
DATABASES の部分のみ紹介します
ユーザ名やホストは適宜変更してください

  • vim mysite/settings.py
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "django_test",
        "HOST": "localhost",
        "PORT": 3306,
        "USER": "root",
        "PASSWORD": "",
        # "ENGINE": "django.db.backends.sqlite3",
        # "NAME": BASE_DIR / "db.sqlite3",
    }
}

manage.py の編集

main の先頭で install_as_MySQLdb をコールします

  • vim manage.py
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys

import pymysql


def main():
    pymysql.install_as_MySQLdb()
    """Run administrative tasks."""
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)


if __name__ == "__main__":
    main()

マイグレーション

  • pipenv run python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, 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 polls.0001_initial... OK
  Applying sessions.0001_initial... OK

動作確認

mysql -u root -p django_test -e "show create table polls_question \G"
Enter password: 
*************************** 1. row ***************************
       Table: polls_question
Create Table: CREATE TABLE `polls_question` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `question_text` varchar(200) NOT NULL,
  `pub_date` datetime(6) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

最後に

切り替え自体は簡単に行なえます
プロダクションでは mysqlclient を使ったほうがいいかなと思います
DATABASES で複数のデータベースを管理するのはどうやればいいのだろうか

参考サイト

0 件のコメント:

コメントを投稿