Django Logo

[Django] Python 3系で MySQL に接続する方法について

Python 3系Django を利用した際に、 MySQL に接続するのにちょっと苦労したので、その時の手順を記載します。Python 2系でやってたやり方だとうまくいかなかったので・・・。
Django のプロジェクトの作成自体がわからない場合は下記の記事を参考にしてもらえればと思います。

環境

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

PyMySQL のインストール

Python 2系では DjangoMySQL との接続に「 MySQL-python 」を利用しますが、 Python 3系では「 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

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

  • 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.pyimport 文のすぐ後ろに下記のコードを追加します。

import pymysql

pymysql.install_as_MySQLdb()

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

最後に

手順としては全然難しいものではありませんが、知らないと結構はまります・・・。私も Stack Overflow などの英語サイトを見てようやく対応できたような感じだったので・・・。もし、Python3系を使っていて、同じ問題を抱えている方がいれば参考にしてもらえればと思います。

「[Django] Python 3系で MySQL に接続する方法について」への3件のフィードバック

  1. ピンバック: [編集中] IIS 10 + Python 3.6.6 + 各種フレームワーク + 各種DB – ぶるぼんの轍

  2. ピンバック: 【Python/Django】mysqlとの接続があまりにあっさりしすぎて拍子抜けした話 | もんプロ~問題解決としてのプログラミング〜

  3. ピンバック: PythonでToDoリスト(web版)を作る | そうさく.net

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です