"Docker-ComposeでPython3.6+NGINX+MariaDB10+uWSGIのDjango環境欲張りセット"のおまけ。
https://qiita.com/NickelCreate/items/bed3dc9d088b57127ba7
環境
- Python 3.6.10
- Django 3.0.7
トラブル発生
つらつらと環境欲張りセットを実行していくと、マイグレーションコマンド実行でバージョン互換エラーが発生。
docker-compose run web ./manage.py makemigrations
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
モジュールを確認すると、以下のような構成(バージョンは最新版を当てたい)
django
djangorestframework
django-filter
uwsgi
pymysql
MySQLクライアントモジュールを、pymysql から mysqlclient に変更&最新化しても現象は解消せず。。
困った。
トラブルシューティング
エラー文言でGoogleって見つかった参照記事【後述①】 を読んでみる。
「Fake PyMySQL's version and install as MySQLdb」
MySQLdb で偽装しろとな、まじか。
setting.py
に書いてみる。
import os
import pymysql
# connect mysql
pymysql.install_as_MySQLdb()
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
(中略)
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'YOUR_DB_NAME',
'USER': 'YOUR_DB_USER',
'PASSWORD': 'YOUR_DB_PWD',
'HOST': 'db',
'PORT': '3306',
}
}
# Fake PyMySQL's version and install as MySQLdb 【偽装ポイント】
pymysql.version_info = (1, 4, 2, "final", 0)
pymysql.install_as_MySQLdb()
(以下略)
再度実行…
docker-compose build
docker-compose up
docker-compose run web ./manage.py makemigrations
するも現象変わらず…
さらにGoogleると、 __init__.py
も 追記修正必要な様子 【参照記事(後述②)】
To resolve this error, add below code in DjangoHelloWorld / DjangoHelloWorld / __init__.py file.
import pymysql
# install pymysql as mysql database driver.
pymysql.install_as_MySQLdb()
再々度実行…
docker-compose build
docker-compose up
docker-compose run web ./manage.py makemigrations
[ERROR] InnoDB: Cannot open datafile for read-only: './your_app/django_migrations.ibd' OS error: 71
なんか新しいエラーが出た、が前進している。
これはエラー発生時に作成されたファイル起因のようなので削除。
rm -f ./mysql/your_app/django_mi>grations.ibd
再実行…
docker-compose run web ./manage.py makemigrations
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
…
ようやっと、マイグレーションコマンドが通った。
お疲れ様でした。
■ 参照記事
① How to use PyMySQL with Django
https://adamj.eu/tech/2020/02/04/how-to-use-pymysql-with-django/
② How To Connect MySQL Database In Django Project
https://www.dev2qa.com/how-to-connect-mysql-database-in-django-project/