Django SQLite3からMySQLへの移行

# まえがき
いままでデータベースはsqliteを使っていましたが、MySQLの勉強も兼ねて移行してみました。
初投稿のため読みづらいと思いますがお許しください。

# 環境

- ubuntu18.04

#手順
### 1.mysqlのインストールとセットアップ

```shell
$ sudo apt install mysql-server mysql-client
```
インストールが完了したら、以下のコマンドでパスワードなどを設定する。基本的には「ｙ」でOK

```shell
$ sudo mysql_secure_installation
```

#### ユーザの作成

```
$ sudo mysql -u root -p
mysql> create user ユーザ名@ホスト名 identified by 'password';
```

- 'ユーザ名'@'ホスト名'のように表す。基本的にはlocalhostで良いはず。
- @以下を省略すると、'ユーザ名'@'%'となり、どのホストからも接続できる。



#### 文字コードをUTF-8にする

/etc/mysql/mysql.conf.d/mysqld.cnfファイルの[mysqld]セクションに以下を追加する。

```
character-set-server = utf8
default_password_lifetime = 0  #パスワードの有効期限をも無効にする
```



#### MySQLを再起動する

```
$ sudo systemctl  restart mysql
```

文字コードを確認する

```
mysql>show variables like '%char%';
+--------------------------------------+----------------------------+
| Variable_name                        | Value                      |
+--------------------------------------+----------------------------+
| character_set_client                 | utf8                       |
| character_set_connection             | utf8                       |
| character_set_database               | utf8                       |
| character_set_filesystem             | binary                     |
| character_set_results                | utf8                       |
| character_set_server                 | utf8                       |
| character_set_system                 | utf8                       |
| character_sets_dir                   | /usr/share/mysql/charsets/ |
| validate_password_special_char_count | 1                          |
+--------------------------------------+----------------------------+

```



# 2.データベース作成

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

rootでログインしておく

```
mysql>create database データベース名
```

#### 権限付与

```
mysql> grant all on データベース名.* to ユーザー名@localhost identified by 'パスワード';
```

- 指定したデータベースの全権限をそのユーザに追加する



### 3.sqlite3のデータを抜き出す

Djangoプロジェクトに移動する。

```
$ python manage.py dumpdata > dump.json
```

これでdump.jsonにデータが書き出される。



# 4.DjangoでMySQLを使う準備

#### settings.pyを変更

データベースの設定を変更する。

```python
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'データベース名',
        'USER': 'ユーザ名',
        'PASSWORD': '',
    }
}
```



#### manage.pyを変更

* 本番環境でも使用する場合は同様にwsgi.pyにも以下のモジュールをインポートする必要がある

```python
#!/usr/bin/env python
import os
import sys
import pymysql # 追加
pymysql.install_as_MySQLdb() # 追加
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
try:
from django.core.management import execute_from_command_line
# 中略
```

#### PyMySQLをインストール

```shell
$ pip install PyMySQL
```



#### migrate実行

```shell
$ python manage.py migrate
```



# 5.MySQLにデータを入れる

さっき準備したdump.jsonを使ってデータを入れる。

このときにMySQLの文字コードをutf-8にする前にloaddataをすると文字コードのエラーが出るので注意！

その場合は、データベースをもう一度作れば大丈夫

```shell
$ python manage.py loaddata dump.json
```



# 参考

- [【Ubuntu 18.04 LTS Server】MySQLサーバを動かす](https://www.yokoweb.net/2018/05/13/ubuntu-18_04-server-mysql/)
- [[Python]DjangoでMySQLを使う方法、ハマったことまとめ](https://code-schools.com/django-mysql/)
- [SQLite3のデータをdumpしてMySQLに移行する](https://qiita.com/nnsnodnb/items/9e99e7f0ca3f82bf2171)