امروز ۰۸ - اردیبهشت - ۰۳
دقیقه مطالعه

ارور Specified key was too long در جنگو

ارور Specified key was too long در جنگو
18 - دی - 1402

خطای Specified key was too long از جمله خطاهایی است که در پروژه‌های پایتون و یا جنگو با دیتابیس mysql  ممکن است با آن مواجه شوید.

ممکن است با این خطا در طی migrate پروژه، در ترمینال سی پنل و یا خط فرمان putty، روبرو شوید.

قبل از بررسی این ارور در جنگو، باید گفت این ارور Specified key was too long از جمله خطاهای شایع در زمان migrate در پروژه های لاراولی هم می باشد که در آموزش جداگانه‌ای در مورد رفع آن توضیح داده شده است. (رفع خطای Specified key was too long در لاراول)

در این آموزش دلیل و روش رفع این ارور را در پروژه‌های جنگو مرور می‌کنیم.

خطای 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

را بزنید تا تغییراتی که در مدل‌های پروژه داشتید بر روی دیتابیس اعمال و اضافه شود.

ممکن در برخی موارد با خطا در زمان مایگریت مواجه شوید.

Specified key was too long; max key length is 1000 bytes

Specified key was too long; max key length is 1000 bytes

در اروری که در ترمینال نمایش داده می‌شود، دقیقا مایگریشنی که ارور دارد مشخص می‌شود و شماره مایگریشن، نام دقیق مایگریشنی و اینکه مربوط به کدام اپ پروژه است، در متن خطا به آن اشاره می‌شود.

خطای مایگریشن در جنگو

خطای مایگریشن در جنگو

هر اپ موجود در پروژه، دارای یک فولدر 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 انجام می‌شود و تغییرات در دیتابیس اعمال می‌شود.

بعد از مایگریت موفق، پروژه راه‌اندازی می‌شود و می‌توانیم با تایپ آدرس نام دامنه و یا سابدامنه در مرورگر ، وب سایت جنگویی خود را مشاهده کنیم.

در صورتی که با تغییرات بالا، خطای پروژه شما رفع نشد و پروژه راه‌اندازی نشد می‌توانید به پشتیبانی پارس وب سرور تیکت بزنید تا همکاران پروژه شما را در اسرع وقت بررسی و پیگیری کنند (درخواست پشتیبانی)

Rate this post
دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

[bws_google_captcha]