Windows+Anaconda+Django環境にXAMPPを入れてMySQLを使う

# 概要

Djangoを使ってもくもく会をすることになったので、Windows上に開発環境を整えました。
[Django公式チュートリアル](https://docs.djangoproject.com/ja/2.1/intro/tutorial01/)ではSQLiteで進めていますが、MySQLを使ってみたかったので導入してみました。Windowsで環境を作ってる人はあまり見かけなかったので参考になれば幸いです。

## 環境

- Windows 10 Pro
- Anaconda 5.3
- Python 3.7
- Django 2.1
- XAMPP 7.2.12
    - MariaDB 10.1.37
    - MySQLバージョンとの互換はよくわからない

# 手順

[XAMPP](https://www.apachefriends.org/jp/index.html)インストールは割愛します🙋

## MySQL用ドライバをインストールする

[公式ページ](https://docs.djangoproject.com/ja/2.1/topics/install/#database-installation)記載の通り、MySQLと連携するにはドライバが必要なようです。`mysqlclient`以外にもPython用のドライバはあるみたいですが、公式に記載のあるものを使います。

### ドライバダウンロード

[こちら](https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient)から自身の環境に合ったドライバをダウンロードします。`cpXX`の部分はPythonバージョンに対応しています。私の環境では`mysqlclient‑1.3.13‑cp37‑cp37m‑win_amd64.whl`を使いました。

- マシンはSurface Laptopなのでamdプロセッサを使ってない気がするけど、これじゃないと動かなかった😐

### ドライバインストール

Anaconda Promptを起動し、ダウンロードディレクトリに移動してからpip installします。**インストール前にDjango環境をactivateします。**
ここでは、Djangoがインストールされている環境を`django`としています。

```shell:AnacondaPrompt
(base) C:\Users\hoge>activate django
(django) C:\Users\hoge>cd Downloads
(django) C:\Users\hoge\Downloads>pip install mysqlclient-1.3.13-cp37-cp37m-win_amd64.whl
Processing c:\users\hoge\downloads\mysqlclient-1.3.13-cp37-cp37m-win_amd64.whl
Installing collected packages: mysqlclient
Successfully installed mysqlclient-1.3.13

(django) C:\Users\hoge\Downloads>
```

## MySQL(MariaDB)側で必要な設定をする

XAMPPを起動して、MySQLサーバもStartしておきます。その後、XAMPPコンソール右側の`Shell`ボタンを押してXAMPPプロンプトを起動します。

### ユーザの作成

DjangoからDBに接続するためのユーザを作ります。面倒なのでフルコントロールを与えます。

```shell:XAMPP_Prompt
$ mysql -u root -p
MariaDB [(none)]> CREATE USER djangouser IDENTIFIED BY 'password';
MariaDB [(none)]> grant all on *.* to djangouser@localhost identified by 'password';
```

### データベースの作成

適当にデータベースを作っておきます。

```shell:XAMPP_Prompt
MariaDB [(none)]> CREATE DATABASE polls;
```

## Django側で接続設定を行う

### プロジェクトを作成する

既に作ってあれば飛ばします。作ってなければ以下で作ります。

```shell:AnacondaPrompt
(django) C:\Users\hoge>django-admin startproject mysite
```

### 接続設定を追記する

プロジェクト直下の`manage.py`を以下のように編集します。

```python:manage.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'polls',
        'USER': 'djangouser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
    }
}
```

### マイグレーションする

`manage.py`が保存されているディレクトリに移動した後マイグレーションを実行します。

```shell:AnacondaPrompt
(django) C:\Users\hoge\project\mysite>python manage.py migrate
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 sessions.0001_initial... OK

(django) C:\Users\hoge\work_django\project\mysite>
```

## DB側を確認する

空のデータベースに以下のテーブルが作成されていれば成功！🙆

```shell:XAMPP_Prompt
MariaDB [mysql]> use polls;
Database changed
MariaDB [polls]> show tables;
+----------------------------+
| Tables_in_polls            |
+----------------------------+
| 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             |
+----------------------------+
10 rows in set (0.00 sec)

MariaDB [polls]>
```