Python3系でDjangoでMySQLに接続する

2017年5月10日

Python3系でDjangoを利用した際に、MySQLに接続するのにちょっと苦労したので、その時の手順を記載します。
Python2系でやってたやり方だとうまくいかなかったので・・・。

Djangoのプロジェクトの作成自体がわからない場合は下記の記事を参考にしてもらえればと思います。

DjangoでWebアプリケーションを構築する

環境

  • Python:3.5.1
  • Django:1.10.5
  • MySQL:5.5.42

PyMySQLのインストール

Python2系ではDjangoとMySQLとの接続に「MySQL-python」を利用しますが、Python3系では「MySQL-python」が利用できないので、「PyMySQL」を使用します。

pipでインストールします。

$ pip install PyMySQL==0.7.9

manage.pyカスタマイズ

manage.pyPyMySQLを利用できるようにします。

以下のコードをimport文のすぐ後ろに追加します。

import pymysql


pymysql.install_as_MySQLdb()

settings.pyを編集する

settings.pyのDBの設定をMySQL用に編集します。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'sample', # DB名を設定
        'USER': 'user', # DBへ接続するユーザIDを設定
        'PASSWORD': 'pass', # DBへ接続するユーザIDのパスワードを設定
        'HOST': 'localhost',
        'PORT': '8889',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
        'TEST': {
            'NAME': 'test_sample'
        }
    }
}

DBを作成する

settings.pyで設定したNAMEと同じ名前のDBを作成しておきます。

CREATE DATABASE sample;

接続確認を行う

実際にマイグレーションを実行してDjangoMySQLが接続できているか確認します。

$ 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 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 sessions.0001_initial... OK

上記コマンドを実行後にMySQLのDBに下記のテーブルが作成されていたら接続成功です。

  • 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

本番環境でもMySQLが使えるようにする

今までの手順を行うことで、runserverの環境であればMySQLを問題なく利用することができます。ただ、runserverの環境はあくまで「開発環境」であり、本番運用の環境ではありません。

「本番環境」でもMySQLが使えるようにするためにはwsgi.pyの編集が必要になります。

wsgi.pyのimport文のすぐ後ろに下記のコードを追加します。

import pymysql


pymysql.install_as_MySQLdb()

これで、「本番環境」でwsgiを利用してWebアプリケーションを実行する場合でも、問題なくMySQLに接続できるようになります。

最後に

手順としては全然難しいものではありませんが、知らないと結構はまります・・・。

私もStack Overflowなどの英語サイトを見てようやく対応できたような感じだったので・・・。

もし、Python3系を使っていて、同じ問題を抱えている方がいれば参考にしてもらえればと思います。