シコウノキロク

アラサー男が自由を手に入れるまでの思考と試行の記録。Python・お金・考察・学んだことが中心

DB初心者向け!MySQLとDjangoを接続[Mac環境]

Djangoを導入すると、最初からSQLiteという軽量データベースが使えます。SQLite、趣味や個人で開発している分には全く申し分ない性能です。

動作が速い・ファイル形式で取り回しが楽・ファイルサイズが小さい等、様々なメリットがある…らしい。

DBの使いこなしているわけでもなく、他のDBを使っているわけでもないためなんとも言えません。言い換えるなら、SQLiteメリットを感じることができるレベルではない!

DBで高いシェアを誇るのがMySQL。それに伴い、情報や使用者が多いのもMySQL

当分、DBを深堀りする予定はないので、リファレンスが多いMySQLに変えておこうと決心。MySQL覚えておけば他DBへの乗り換えも楽みたいですし。

今回は導入として、Mac上にMySQLを導入してDjangoと接続しています。

環境

  • macOS Sierra 10.12.5
  • Homebrew 1.2.3
  • MySQL Ver 14.14 Distrib 5.7.18
  • Python 3.6.0
  • Django 1.11.2
  • PyMySQL 0.7.11

MySQLの導入

MySQLのインストールには、Macのパッケージ管理ソフトHomebrewを使用。

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

brew install mysql

mysql --version

mysqlのバージョンが確認できましたか。簡単ですね。Homebrewすごい。

MySQLでデータベース作成

MySQLサーバーを立ち上げて、MySQLコマンドラインを起動します。

mysql.server start

mysql -u root

起動がうまくいけば、ホスト名(左側の表示)の部分がmysql>となってるはずです。

サーバーの立ち上げが上手くいかない場合は過去記事を参照ください。

shikouno.hatenablog.com

MySQLコマンドラインが立ち上がったら、djangoと接続するためのデータベースを作成します。

CREATE DATABASE django_mysql;

SHOW DATABASES;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| django_mysql       |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

Djangoの接続するDBをMySQLに設定

まずdjangoのプロジェクトを作成します。

pipでDjangoを入れます。ついでにpythonMySQLを紐づけるpymysqlも一緒にインストールしています。

python -m venv env

. env/bin/activate

pip install django pymysql

django-admin startproject django_mysql

cd django_mysql

django_mysql/settings.pyに使用するDBがMySQLであることを明記します。

その際、pipで導入したpymysqlのimportを忘れないようにしましょう。よく忘れちゃう。

import pymysql
pymysql.install_as_MySQLdb()

DATABASES = {
'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_mysql',  #上記で作成したデータベース名
        'USER': 'root',   #MySQLの設定変更をしていなければ以下コピペ
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
#    'default': {
#        'ENGINE': 'django.db.backends.sqlite3',
#        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

DjangoでDBのテーブルを作成

Djangoのアプリケーションを作成し、django_mysql/settings.pyに名前を記述します。

python manage.py startapp apps

vi django_mysql/settigns.py
INSTALLED_APPS = [
    'apps',   #この行
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

次にアプリケーションのmodels.pyを編集してデータベースのテーブルを記述します。

ちなみに、CharFieldは文字列、DataTimeFieldは日時を扱います。名前の通りですね。

vi apps/models.py
from django.db import models

class Text(models.Model):
    title = models.CharField(max_length=20)
    content = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

models.pyで書いたモデルを元にマイグレーションします。

python manage.py makemigrations

python manage.py migrate

マイグレーションが成功したら、MySQLにテーブルが作成されています!

DjangoMySQLの接続を確認

テーブルが作成されているかをMySQLのシェルで確認してみましょう。

mysql -u root

USE django_mysql;

SHOW TABLES;
+----------------------------+
| Tables_in_django_mysql     |
+----------------------------+
| apps_text                  |
| 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             |
+----------------------------+

DESCRIBE apps_text;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| title    | varchar(20)  | NO   |     | NULL    |                |
| content  | varchar(200) | NO   |     | NULL    |                |
| pub_date | datetime(6)  | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

最上段のidは自動で挿入されるようです。ユニークなIDとして働きます。title、content、pub_dateはapps/models.pyに記述した通りですね。

おわりに

接続できればSQLiteと同様に取り扱うことができます。後は、SQLを記述せずに管理画面から操作できるDjangoのメリットを堪能しましょう。

最後までお読み頂きありがとうございました。

MacにMySQLをインストールして触ってみる | Developers.IO

はじめての Django アプリ作成、その2 | Django documentation | Django

これからMySQLをイチから学ぶ人に捧げたい23個のコマンドリスト