概要
Ubuntu22.04のMySQL8.0.30と、venv仮想環境のDjango3.2+Django REST frameworkをDjango公式推奨のmysqlclientで連携して、環境構築がちゃんとできているか確認するために簡単なAPIサーバを作成します。Pythonのバージョンは3.10.6です。Pyhon、MySQLはインストール済みです。
2022/8/10現在Djangoは3.2系の最新は3.2.15、Django REST frameworkの最新は3.13.1でした。
$ python3 -m pip install Django==
$ python3 -m pip install djangorestframework==
手順1 DBを作成する
djangoで使うtestという名前のDBを作成します。
$ sudo mysql -u root
mysql> create database test;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test |
+--------------------+
5 rows in set (0.00 sec)
手順2 MySQLにdjango接続用ユーザを作成
djangoからDBのtestに接続するためのユーザdjangoを作成します。全権限与えておきます。
mysql> CREATE USER 'django'@'localhost' IDENTIFIED BY 'password';
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| debian-sys-maint | localhost |
| django | localhost |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
| windows | localhost |
+------------------+-----------+
7 rows in set (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON test.* TO 'django'@'localhost';
mysql> show grants for 'django'@'localhost';
+----------------------------------------------------------+
| Grants for django@localhost |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO `django`@`localhost` |
| GRANT ALL PRIVILEGES ON `test`.* TO `django`@`localhost` |
+----------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> exit
手順3 venv仮想環境を作ってDjangoとDjango REST frameworkをインストール
venv仮想環境を作って、その中でpipを最新版にします。その後、Djangoは3.2で最新のもの、Django REST frameworkは最新のものをインストールするコマンドを実行します。
$ mkdir solution
$ cd solution
solution$ python3 -m venv .venv_drf
solution$ source .venv_drf/bin/activate
(.venv_drf) solution$ python -m pip install --upgrade pip
(.venv_drf) solution$ python -m pip install Django==3.2.*
(.venv_drf) solution$ python -m pip install djangorestframework
(.venv_drf) solution$ deactivate
solution$ cd
手順4 mysqlclienをvenv仮想環境にインストール
MySQL 開発ヘッダーとライブラリをインストール後、手順3で作成したvenv仮想環境にmysqlclientをインストールします。
$ sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
$ cd solution
solution$ source .venv_drf/bin/activate
(.venv_drf) solution$ python -m pip install mysqlclient
手順5 簡単なAPIサーバを作成する
目的は、環境構築がうまくいっているかの確認と、DjangoとDRFのイメージをなんとなくつかむことです。こちらの本の第9章を読んでコピペして作っていきます。ここからは作業用PCのWindows10 ProのVSCodeでリモートのUbuntuに接続して作業していきます。プロジェクト構成はこんな感じです。
configフォルダにプロジェクトを作成して、アプリを作成しました。
(.venv_drf) solution$ django-admin startproject config .
(.venv_drf) solution$ python manage.py startapp shop
(.venv_drf) solution$ python manage.py startapp apiv1
そのあとコピペでgitのプログラムを参考に書き換えていきました。データベース接続のところはMySQLと接続するためこのように書き換えました。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'django',
'PASSWORD': 'password',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
書き換え終わったら、データベースのマイグレーションをして、ログインのためのユーザを作って、サーバ起動しました。
(.venv_drf) solution$ python manage.py makemigrations shop
(.venv_drf) solution$ python manage.py migrate
(.venv_drf) solution$ python manage.py createsuperuser
(.venv_drf) solution$ python manage.py runserver
ブラウザで127.0.0.1:8000を入力するとちゃんと表示されました。リモートなのに127.0.0.1:8000で表示できる理由は、VSCodeがポート転送してくれているからです。
テストで登録したhelloworldもMySQLに正しく登録されていました。
mysql> show tables;
+----------------------------+
| Tables_in_test |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| book |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
11 rows in set (0.00 sec)
mysql> select * from book;
+----------------------------------+------------+-------+----------------------------+
| id | title | price | created_at |
+----------------------------------+------------+-------+----------------------------+
| 1ed4430ce21e4cd0a3064eb6a54b0e6a | helloworld | 1 | 2022-08-09 10:50:30.626551 |
+----------------------------------+------------+-------+----------------------------+
1 row in set (0.00 sec)