امروز : ۱۲ فروردین ۱۴۰۴ (2025/04/01)

ارور 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 می‌باشد که تغییراتی که باید در دیتابیس اعمال شود، در آن ذخیره می‌شود.

  • اگر با خطای مایگریشن مواجه شدید، باید مدل مربوط به همان اپ اصلاح شود.

 

نکات مهم در تنظیمات کاراکترهای فارسی و ایندکس‌ها

  1. استفاده از کاراکترهای فارسی در اسلاگ و URL:

    • در صورتی که از کاراکتر های فارسی در اسلاگ و URL استفاده شود، باید مقدار max_length آن رکورد حداکثر 250 تنظیم شود.
  2. محدودیت‌های MySQL 8.0.3:

    • در MySQL 8.0.3 وقتی یک ستون به عنوان ایندکس انتخاب می‌شود (یعنی مقدار db_index=True به عنوان ویژگی آن تعریف می‌شود)، حداکثر تعداد کاراکتر یا max_length آن ستون باید 250 کاراکتر باشد.
    • اگر عدد بیشتری از این مقدار تنظیم شود، پروژه با خطای زیر مواجه می‌شود:
      • Error: The column size is too large for the index.
  3. **محدودیت‌های SlugField:

    • در مورد 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 انجام می‌شود و تغییرات در دیتابیس اعمال می‌شود.

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

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

5/5 - (1 امتیاز)
نظر و تجربیات خودتون رو درباره ارور Specified key was too long در جنگو با ما به اشتراک بگذارید

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