猫でもわかるWebプログラミング

試行錯誤しながらエンジニア(プログラマー)として働く猫のブログ。技術的な話や、働き方の話、読書録とか、試行錯誤している日常の話。

Django 2.2 → 3.1 バージョンアップで MySQL may not allow unique CharFields to have a max_length > 255

f:id:yoshiki_utakata:20210307171243p:plain

Django を2.2 → 3.1 にバージョンアップしたら、以下の Warning が出るようになった。

test_app.Thumbnail.url: (mysql.W003) 
MySQL may not allow unique CharFields to have a max_length > 255.
    HINT: See: https://docs.djangoproject.com/en/3.1/ref/databases/#mysql-character-fields

日本語にすると「MySQL は 255文字以上の max_length を持つ CharField に unique を付与できないかもしれない

と書いてあります。

しかし、これ、Django 3.1 で Warning が出るようになりましたが、今まで問題なくマイグレーションできていました。

一体どういうことでしょう。

長さが MySQL の設定などによって違う

以下の記事にも書きましたが、 MySQL のテーブルの設定によって、インデックスや unique にできる CharField の長さが違います。

記事では主にインデックスについて書かれていますが、 unique も同じです。実際にどれくらいの長さなのかは記事を読んでください。

www.utakata.work

いろいろな設定がありますが、一番長さが短い設定のとき、インデックスや unique が張れるのは 767 バイト、文字数にすると 255 文字になります。

設定によっては255文字超ててもインデックス張れるが、張れない場合もあるので、「unique にできない かもしれません」というエラーになります。

どう対応すれば良いのか

実際にマイグレーションして、テーブルが作れたなら問題有りません。

Warning を消したいのであれば、設定で SILENCED_SYSTEM_CHECKS を指定して、Warning を抑制するのが良いと思います。

SILENCED_SYSTEM_CHECKS = ['mysql.W003']