Ubuntu22.04 MySQL+mysqlclient+Django+Django REST frameworkで簡単なAPIサーバを作る

## 概要
Ubuntu22.04のMySQL8.0.30と、venv仮想環境のDjango3.2+Django REST frameworkをDjango公式推奨のmysqlclientで連携して、環境構築がちゃんとできているか確認するために簡単なAPIサーバを作成します。Pythonのバージョンは3.10.6です。Pyhon、MySQLはインストール済みです。

https://qiita.com/lustm5/items/ef8dc276872d04707a90

https://qiita.com/lustm5/items/18dcea509e190a62e83a

2022/8/10現在Djangoは3.2系の最新は3.2.15、Django REST frameworkの最新は3.13.1でした。
```
$ python3 -m pip install Django==
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/3c346799-5041-09d0-5de6-0d729b7104df.png)
```
$ python3 -m pip install djangorestframework==
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/a70e889d-d011-653e-af76-485634d47172.png)

## 手順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
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/577aaac6-91a5-dc6d-2a9d-02fab188bc5c.png)

## 手順5 簡単なAPIサーバを作成する
目的は、環境構築がうまくいっているかの確認と、DjangoとDRFのイメージをなんとなくつかむことです。[こちらの本の第9章](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Django-Framework-%EF%BC%88Django-%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%89-ebook/dp/B07XWL8FPM/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=3JNH1XY5TOG1H&keywords=drf+django&qid=1660044532&sprefix=drf+django%2Caps%2C167&sr=8-1)を読んでコピペして作っていきます。ここからは作業用PCのWindows10 ProのVSCodeでリモートのUbuntuに接続して作業していきます。プロジェクト構成はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/b4e94a69-fbee-24e3-c433-d6204b10c317.png)
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と接続するためこのように書き換えました。
```config/settings.py
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がポート転送してくれているからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/1b0de981-51c4-b14b-2a8f-99393fa83b84.png)

DjangoとMySQLの連携は問題ありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2744334/ee012d60-fffc-d0b5-d39b-b1ece2d7a60d.png)

テストで登録した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)
```