1
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-08-09

概要

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==

image.png

$ python3 -m pip install djangorestframework==

image.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

手順5 簡単なAPIサーバを作成する

目的は、環境構築がうまくいっているかの確認と、DjangoとDRFのイメージをなんとなくつかむことです。こちらの本の第9章を読んでコピペして作っていきます。ここからは作業用PCのWindows10 ProのVSCodeでリモートのUbuntuに接続して作業していきます。プロジェクト構成はこんな感じです。
image.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

DjangoとMySQLの連携は問題ありませんでした。
image.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)
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0