概要
- DBマイグレーションを実施したら
Unknown MySQL server host
とかpymysql.err.OperationalError:
といったエラーが発生したので、その解決方法を残しておく。
環境
- Mac
- 機種ID:MacBookPro18,3
- macOS:Monterey
- チップ: Apple M1 Pro
- メモリ: 16GB
前提
- 会社で使っているdjangoプログラムを自分のローカル環境で触ることになった。djangoを覚えるためにも、DBのマイグレーションまで実施したい。
-
docker-compose.yml
の定義は以下の通り- serviceはdjango
- web serverはnginx
- databaseはmysql
-
settings.py
のDATABASESには‘HOST’: “mysql”
と記載があり、docker-compose.yml
のDB名mysql
と一致してある
エラー内容
-
python3 manage.py makemigrations
の結果
/opt/homebrew/lib/python3.10/site-packages/django/core/xxxxxx/commands/makemigrations.py:143: RuntimeWarning: Got an error checking a consistent migration history performed for database connection 'default': (2005, "Unknown MySQL server host 'mysql' (8)")
warnings.warn(
No changes detected
-
python3 manage.py migrate
の結果
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'mysql' ([Errno 8] nodename nor servname provided, or not known)")
原因の追求
-
エラー文章を頼りに色々調べたが、どちらも“mysql”に関係があることと考えられる
-
dockerに関係があるかと思い、以下実施したが、関係なし
-
docker compose down
やdocker compose up -d
、docker-compose down -v
を実施 - PCを再起動
-
-
試しにsettings.pyのHOSTの
mysql
をlocalhostのアドレス 127.0.0.1 と記入してマイグレーションを実施してみたが、以下エラーメッセージとなる。内容は変わっているが、今回とは関係なさそう。
django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
- 上記対応中に以下エラーが発生したので、
pip install cryptography
を実施したら、以下エラーは発生しなくなった
RuntimeError: cryptography is required for sha256_password or caching_sha2_password
-
docker-compose.ymlの編集についてもいくつか記事があったが、変わらず。
-
その後もいろいろ調べたのですが、全然わからぬ。。。
- 翌日、とうとう先輩に相談...!!
解決方法
- あっさり解決しました。さすが先輩!
- 今回、dockerを利用しているので、DBマイグレーションする時もDockerのコンテナに入らないといけない。つまり、以下コマンドを実行する
- コンテナ名は、docker-compose.ymlで定義したサービス名
docker exec -it [コンテナ名] bash
- プロンプトが変わったことが確認できます。
- bashに入ってから、manage.pyがあるディレクトリで、
python3 manage.py migrate
を行うと、、
Operations to perform:
Apply all migrations:
#####################
... OK
-
できたぁー!!!!!
-
docker compose up -d
でコンテナを起動しているので問題ないと勘違いしていました。なるほど、コンテナに入ってbashでコンテナ環境とホストOS(カーネル等)をつないであげないといけなかったんですね。