ارور Specified key was too long در جنگو
خطای Specified key was too long از جمله خطاهایی است که در پروژههای پایتون و یا جنگو با دیتابیس mysql ممکن است با آن مواجه شوید.
ممکن است با این خطا در طی migrate پروژه، در ترمینال سی پنل و یا خط فرمان putty، روبرو شوید.
قبل از بررسی این ارور در جنگو، باید گفت این ارور Specified key was too long از جمله خطاهای شایع در زمان migrate در پروژه های لاراولی هم می باشد که در آموزش جداگانهای در مورد رفع آن توضیح داده شده است. (رفع خطای Specified key was too long در لاراول)
در این آموزش دلیل و روش رفع این ارور را در پروژههای جنگو مرور میکنیم.
در زمان مایگریت کردن پروژه جنگو بر روی هاستهایی که از دیتابیس mysql استفاده میکنند و engine database بر روی myisam قرار دارد، ممکن است با خطای زیر مواجه شوید :
django.db.utils.OperationalError: (1071, ‘Specified key was too long; max key length is 1000 bytes’)
این خطا بر روی هاستهای با دیتابیس mariadb وجود ندارد.
تشخیص نوع دیتابیس، ماریادی بی یا mysql
برای اینکه بدانید دیتابیس شما از چه نوعی هست و آیا ماریادیبی هست و یا mysql، وارد سیپنل شوید (آموزش لاگین به سیپنل) و در صفحه اصلی سیپنل روی گزینهی phpmyadmin کلیک کنید.
در صفحه ای که برای شما باز میشود میتوانید نوع دیتابیس را مشاهده کنید.
دلیل خطای Specified key was too long
بعد از اینکه وارد ترمینال سیپنل شدید و دستور سورس پروژه را وارد کردید، میتوانید دستورات
python manage.py makemigrations
python manage.py migrate
را بزنید تا تغییراتی که در مدلهای پروژه داشتید بر روی دیتابیس اعمال و اضافه شود.
ممکن در برخی موارد با خطا در زمان مایگریت مواجه شوید.
در اروری که در ترمینال نمایش داده میشود، دقیقا مایگریشنی که ارور دارد مشخص میشود و شماره مایگریشن، نام دقیق مایگریشنی و اینکه مربوط به کدام اپ پروژه است، در متن خطا به آن اشاره میشود.
هر اپ موجود در پروژه، دارای یک فولدر migrations میباشد که تغییراتی که باید در دیتابیس اعمال شود، در آن ذخیره میشود.
با توجه به مایگریشنی که خطا دارد، باید مدل مربوط به همان اپ اصلاح شود.
در صورتی که از کاراکترهای فارسی در اسلاگ و url استفاده شود باید max-lenght آن رکورد، حداکثر عدد 250 تنظیم شود.
در mysql 8.0.3 وقتی یک ستون به عنوان ایندکس انتخاب میشود، یعنی مقدار db_index=True به عنوان ویژگی آن تعریف می شود، حداکثر تعداد کاراکتر یا max-lenghth آن ستون حداکثر 250 کاراکتر میباشد و اگر عدد بیشتری از این مقدار تنظیم شود، پروژه با این ارور مواجه میشود.
همینطور در مورد SlugField هم حداکثر مقدار کاراکتر مجاز 250 کاراکتر میباشد.
حذف مایگریشن های قبلی و ایجاد مایگریشن های جدید
بعد از اینکه تغییرات مورد نظر بر روی مدلها اعمال شد و مواردی که max-lenght آنها به 250 تغییر پیدا کرد، باید مایگریشنهای قبلی حذف شود تا مایگریشن های جدید ایجاد شود.
در ترمینال و در مسیر پروژه با زدن جداگانه هر کدام از دستورات زیر، مایگریشنها و کش مربوط به مایگریشنها (محتویات فولدر _pycache_) حذف میشوند .
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*_pycache_*.pyc" -delete
در هر فولدر migrations یک فایل به نام __init__.py باید وجود داشته باشد.
اگر احیانا به اشتباه این فایل پاک شد باید فایلی به همین نام و بدون هیچ محتوایی، ایجاد شود.
این فایل بدون هیچ محتوایی می باشد و برای تهیه مایگریشن در فولدر migrations ضروری میباشد.
توجه داشته باشید که بعد از تغییرات و ایجاد مایگریشن جدید و قبل از اجرای دستور
python manage.py migrate
باید جداول دیتابیس مربوط به پروژه حذف شوند، یعنی همه آنها انتخاب و drop شوند تا از نو ساخته شوند.
در صورتی که این کار انجام نشود در زمان مایگریت، پیامی نمایش داده میشود که یک جدول در دیتابیس با نام مشابه وجود دارد و عملیات migrate ناقص میماند.
در صورتی که خطای دیگری وجود نداشته باشد عملیات migrate انجام میشود و تغییرات در دیتابیس اعمال میشود.
بعد از مایگریت موفق، پروژه راهاندازی میشود و میتوانیم با تایپ آدرس نام دامنه و یا سابدامنه در مرورگر ، وب سایت جنگویی خود را مشاهده کنیم.
در صورتی که با تغییرات بالا، خطای پروژه شما رفع نشد و پروژه راهاندازی نشد میتوانید به پشتیبانی پارس وب سرور تیکت بزنید تا همکاران پروژه شما را در اسرع وقت بررسی و پیگیری کنند (درخواست پشتیبانی)