DjangoでMySQLに接続(Docekrコンテナ別)

#◆djagnoでデータベースの接続先をsqlite3からMySQLに変更
dockerでpythonコンテナとデータベースコンテナを分けています。
データベースコンテナにはMySQLをインストールしています。

データベースの接続先をMySQLに変更する際に触った設定について記載します。

#◆データベースコンテナに入る

```
$ winpty docker-compose exec db bash
```

#◆データベースに接続

```
/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 5.7.32 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

#◆データベースを確認

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.04 sec)
```

djangoに接続するデータベースがないことを確認しました。

#◆pythonコンテナに入る

```
$ winpty docker-compose exec python bash
```

#◆djangoのsettings.pyの中身

```
DATABASES = {
    'default': {
		'ENGINE': 'django.db.backends.mysql',
		'NAME': 'mysql',
		'USER': '------',
		'PASSWORD': '-----',
		'HOST': '-----',
		'PORT': '-----',
```

#◆pymysqlをインストール

```
pip install pymysql
```

#◆djangoアプリのmanage.pyの中身
以下を追記しました。

```
import pymysql
pymysql.install_as_MySQLdb()
```

#◆データベースにテーブルを追加

```
python manage.py migrate
```

#◆データベースにテーブルができているかを確認

mysqlコンテナに入り、データベースに接続します。
その後、以下を入力します。

```
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------------------+
| Tables_in_mysql            |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| board_board                |
| columns_priv               |
| db                         |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| engine_cost                |
| event                      |
| func                       |
| general_log                |
| gtid_executed              |
| help_category              |
| help_keyword               |
| help_relation              |
| help_topic                 |
| innodb_index_stats         |
| innodb_table_stats         |
| ndb_binlog_index           |
| plugin                     |
| proc                       |
| procs_priv                 |
| proxies_priv               |
| server_cost                |
| servers                    |
| slave_master_info          |
| slave_relay_log_info       |
| slave_worker_info          |
| slow_log                   |
| tables_priv                |
| time_zone                  |
| time_zone_leap_second      |
| time_zone_name             |
| time_zone_transition       |
| time_zone_transition_type  |
| user                       |
+----------------------------+

```

テーブルが作成されていることを確認しました。

#◆テーブルを作成する
djangoのmodels.pyに以下を記載し、テーブルを作成します。

```
from django.db import models

# Create your models here.

class Users(models.Model):
    name = models.CharField(max_length=255)
    kana = models.CharField(max_length=255)
    email = models.CharField(max_length=255)
    tel = models.CharField(max_length=13, null=True)
    password = models.CharField(max_length=255, null=True)
    created_at = models.DateTimeField()
    updated_at = models.DateTimeField(null=True)

    class Meta:
        db_table = "users"
```

#◆テーブルにデータを格納する
以下のjsonファイルを用意します。

```
[
  {
    "model": "board.Users",
    "pk": 1,
    "fields": {
      "name": "テスト",
      "kana": "てすと",
      "email": "test@gmail.com",
      "tel": "09000000000",
      "password": "11111111",
      "created_at": "2020-01-01T10:00:00.000"
    }
  }
]
```

以下のコマンドでテーブルにjsonファイルに記載したデータを格納します。

```
 python manage.py loaddata board/fixtures/users.json
```

#◆データを確認する

```
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 45
Server version: 5.7.32 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------------------+
| Tables_in_mysql            |
+----------------------------+
| ~~~~~~~~~~~~~~             |
| time_zone_transition       |
| time_zone_transition_type  |
| user                       |
| users                      |
+----------------------------+
47 rows in set (0.00 sec)

mysql> describe users;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | NO   |     | NULL    |                |
| kana       | varchar(255) | NO   |     | NULL    |                |
| email      | varchar(255) | NO   |     | NULL    |                |
| tel        | varchar(13)  | YES  |     | NULL    |                |
| password   | varchar(255) | YES  |     | NULL    |                |
| created_at | datetime(6)  | NO   |     | NULL    |                |
| updated_at | datetime(6)  | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

mysql> select * from users;
+----+------+------+----------------+-------------+----------+----------------------------+------------+
| id | name | kana | email          | tel         | password | created_at                 | updated_at |
+----+------+------+----------------+-------------+----------+----------------------------+------------+
|  1 | ???  | ???  | test@gmail.com | 09000000000 | 11111111 | 2020-01-01 01:00:00.000000 | NULL       |
+----+------+------+----------------+-------------+----------+----------------------------+------------+
1 row in set (0.03 sec)
```

データが格納されていることが確認できました。