【WSL】Django2.2からmysqlclientを導入した際のエラー&成功例


投稿日 2019年9月19日 >> 更新日 2023年3月2日

今回はDjangoのデータベースドライバーであるmysqlclientの導入についてお話します。

Django2.2以降からMySQLドライバーがmysqlclientを必要としました。

前提

  • WSL(Windows Subsystem for Linux)
  • MySQLインストール場所(WindowsCドライバー)
  • Djangoデータベースドライバー(pymysql)
  • Django2.2以降

私の環境がWSL(Windows Subsystem for Linux)というこもあり、かなりハマりました。

まずDjango側で起きているエラー「django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.」の言うように、pipでmysqlclientをインストールしようとするとエラーになり、そこから長い旅が始まりました。

最終的に、「順番通り」必要なモジュールを導入した結果成功するに至りましたが、WSL環境だと、疑いの目がWindows側かUbuntu側右往左往してしまい混乱に陥ることもあります。

ですので、WSLのための導入例になりますが、まずは成功例から見ていきましょう。

mysqlclientのインスール成功例

まずは成功例からお話ししますが、Djangoを起動、もしくわマイグレーションを実行した直前の状態を前提とします。

なぜなら、色々な設定を施してしまったが故のエラーも起こりうるからです。

そのエラーについては後の「エラーの例」でお話しします。

そもそもmysqlclientというのはMySQLを使用するためのドライバーでフレームワークと紐づけるために使われます。

私がDjango2.2以前に使用していたドライバーはpymysqlというもので、こちらのドライバーがDjango2.2以降から使えなくなるから、公式推奨のmysqlclientが必要だとのことです。

なのでまず、mysqlclientに必要なMySQL開発ヘッダーとライブラリをインストールします。公式プロジェクトの説明


$ sudo apt install python3-dev default-libmysqlclient-dev

インストールすると、/usr/bin/もしくわ/local/bin/ディレクトリの中に、mysql_configファイルが設置されます。

114行目あたりはこのように設定されています。(書き換えないように注意)

# /usr/bin/mysql_config

# 設置されている階層に移動し管理者権限viエディタで開く
$ sudo vim mysql_config

libs="-L$pkglibdir"
libs="$libs -lmysqlclient -lpthread -lz -lm -lrt -latomic -ldl"

mysql_configファイルが設置されていることを確認したら、既存のドライバーであるpymysqlをアンインストールし、最新のmysqlclientをインストールしていきます。

pymysqlをアンインストール


$ pip3 uninstall pymysql

最新のmysqlclientをインストール


$ pip3 install --upgrade mysqlclient

正常にインストールされたら、Djangoプロジェクトのsettings.pyを編集します。

既存の設定

# settings.py

import pymysql        ←削除
pymysql.install_as_MySQLdb() ←削除

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'データベース名',
        'USER': 'root',
        'PASSWORD': 'パスワード',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

編集後

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'データベース名',
        'USER': 'root',
        'PASSWORD': 'パスワード',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

これでマイグレーションなどを行うことができれば成功です。

mysqlclientのインストールがうまくいかないエラー例

そもそもpipでmysqlclientがインストールできない。

エラー例

  • Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-1it4awj1/mysqlclient/
  • error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

最初私は、WSLでの開発環境であるので、Windows用のmysqlclientファイルでのインストールなのか疑いましたが、もちろんそのファイルはUbuntuターミナルでは実行できません。(このようなファイル:mysqlclient‑1.3.9‑cp34‑cp34m‑win_amd64.whl)

そして上でmysql_configファイルの説明をしましたが、私はエラー当時設定を書き換えていました。

たとえばデフォルトではこのようになっていましたが、

# /usr/bin/mysql_config

libs="-L$pkglibdir"
libs="$libs -lmysqlclient -lpthread -lz -lm -lrt -latomic -ldl"

設定を変えることによって成功すると言ったようなサイトを拝見して、編集をして再度試しました。

# /usr/bin/mysql_config

libs="-L$pkglibdir"
libs="$libs -lmysqlclient -lssl -lcrypto"   ←修正

この設定はどうやらmacOSでの設定らしく、デフォルに戻すため、default-libmysqlclient-devを一度アンインストールして再度入れ直しました。


# 削除
$ sudo apt remove default-libmysqlclient-dev

# 再度インストール
$ sudo apt install default-libmysqlclient-dev

そして既存ドライバーであるpymysqlをアンインストールしたらmysqlclientがインストールされるようになりました。

この既存ドライバーをmysqlclientをインストールする前に削除したことによって、エラーを起こさずに導入する事ができました。

私が犯した過ちは、色々なサイトを参考にさせていただきましたが、余計な設定などを行い返って混乱を招いたということになります。

それでは以上になります。

最後までご覧いただきありがとうございました。