メインコンテンツまでスキップ

Django: エラー解決法 "raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; 〜) django.core.exceptions.ImproperlyConfigured: 〜"

· 約3分
Yu Sasaki
Enterprise Security Manager / Advisor

Django 2.2のリリースに伴い、早速既存のWebアプリの互換性チェックの為にライブラリのversion updateを行ったが、下記のエラーメッセージが出力されマイグレーションが異常終了。

事象発生時のエラーメッセージ

(venv) $ python manage.py makemigrations <アプリ名>
Traceback (most recent call last):
File "manage.py", line 17, in
execute_from_command_line(sys.argv)
<中略>
File "<略>/venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 36, in
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

発生環境

macOS v10.14.4, Python 3.7, Django 2.2, PyMySQL 0.9.3

原因

メッセージの通り、mysqlclientのバージョンが低いから。今更ながらDjango側の推奨MySQL (MariaDB)ライブラリはPyMySQLではなくmysqlclientであることを知る。

公式ドキュメント:Databases | Django documentation | Django

参考までに両ライブラリの記事公開時点の最新バージョンを掲載。

解決法

公式推奨のライブラリに切り替えるべく、PyMySQLのアンインストール及びmysqlclientのインストールを以下のコマンドで行う。

(venv) $ pip uninstall pymysql
(venv) $ pip install mysqlclient

仮にmysqlclientのインストールでエラーが発生為た場合は下記の記事をご参照。 Django: macOSでのpip install mysqlclient エラーの解決法

記事公開時点での確認環境は以下の通り。

Django==2.2.1
mysqlclient==1.4.2.post1

ライブラリのインストール完了後、各ファイル(※1)で宣言されたpymysqlに関わるステートメント(※2)を削除していく。 ※1:

  1. manage.py
  2. プロジェクトフォルダ名/__init__.py

※2:

import pymysql
pymysql.install_as_MySQLdb()

Djangoライブラリのupdate後はmigrationを実施する。ここで問題なければ事象解消と言って良い。

(venv) $ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sc, sessions
Running migrations:
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK

仮にmigrationを実施しない場合はrunserver実行時に下記の警告が発生する為。

(venv) $ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 2 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): auth.
Run 'python manage.py migrate' to apply them.
<後略>

尚、settings.pyのDATABASES変数はPyMySQLと同値で問題ない。

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'XXX', # データベース名
'USER': 'YYY', # ユーザ名
'PASSWORD': 'ZZZ', # パスワード
'HOST': '127.0.0.1', # MariaDBがあるサーバのIPアドレスやホストを。空欄はローカルホスト
'PORT': '3306', # 空欄はデフォルトポートの3306
}
}