سلام رفقا ?
امیدوارم حالتون خوب باشه ?
عنوان مقاله داره همه چیز رو میگه! میخوایم MySql رو روی جنگو نصب کنیم. در واقع میخوایم ارور هایی که موقع نصب MySql رو جنگو ممکنه اتفاق بیفته رو بررسی کنیم و درست شون کنیم. پس بریم که داشته باشیم...
شما زمانی که یک پروژه ی جنگو رو استارت میزنید به طور پیشفرض از Sqlite برای ذخیرهی دیتا استفاده میکنه. اما اگه بخواید از MySql یا هر دیتابیس دیگه ای استفاده کنید یه کارایی باید انجام بدید.
واسه ی نصب بقیه ی دیتابیس ها میتونید داکیومنت جنگو رو چک کنید. ولی تو این مقاله من میخوام درباره ی نصب MySql حرف بزنم.
به طور معمول زمانی که بخواید تو جنگو MySql رو جایگزین Sqlite کنید باید قسمت DATABASES فایل settings.py رو به این شکل تغییر بدین:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '<DATABASE NAME>', 'USER': '<USERNAME>', 'PASSWORD': '<PASSWORD>', 'HOST': 'localhost', 'PORT': '3306', } }
طبیعتاً از قبل باید MySql رو نصب کرده باشید و یک یوزر و پسورد و دیتابیس داخلش درست کرده باشین. (استفاده از یوزر root توصیه نمیشود ?)
اگه به همین شکل سرور رو ران کنید احتمالا به یه ارور طولانی میخورید که تهش اینو نوشته:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient?
جنگو به یه جور کلاینت (یا دقیق تر بخوام بگم یه DB API driver) نیاز داره تا بتونه با دیتابیس MySql ارتباط داشته باشه. چیزی که خود ارور گفته اینه که mysqlclient رو نصب کنید.
خب الان دوتا انتخاب داریم، نصب خود mysqlclient که توسط داکیومنت جنگو هم پیشنهاد شده؛ یا نصب PyMySql.
واسه نصب mysqlclient کامند زیر رو توی ترمینال بزنید:
$ pip3 install mysqlclient
که احتمالا بعدش همچین اروری میبینید:
ERROR: Command errored out with exit status 1: command: /bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-hxa4odvx/mysqlclient/setup.py'"'"'; __file__='"'"'/tmp/pip-install-hxa4odvx/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-hxa4odvx/mysqlclient/pip-egg-info cwd: /tmp/pip-install-hxa4odvx/mysqlclient/ Complete output (12 lines): /bin/sh: 1: mysql_config: not found /bin/sh: 1: mariadb_config: not found /bin/sh: 1: mysql_config: not found Traceback (most recent call last): File "<string>", line 1, in <module> File "/tmp/pip-install-hxa4odvx/mysqlclient/setup.py", line 15, in <module> metadata, options = get_config() File "/tmp/pip-install-hxa4odvx/mysqlclient/setup_posix.py", line 65, in get_config libs = mysql_config("libs") File "/tmp/pip-install-hxa4odvx/mysqlclient/setup_posix.py", line 31, in mysql_config raise OSError("{} not found".format(_mysql_config_path)) OSError: mysql_config not found ---------------------------------------- ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
خط ۱۶ رو یه بار دیگه ببینید: OS Error
یه سری پیش نیاز برای نصب mysqlclient روی سیستم عامل های مختلف باید نصب شه. بر اساس سیستم عاملی که رو سیستم تون دارید دستورات زیر رو وارد کنید:
sudo apt-get install python-dev default-libmysqlclient-dev # Debian / Ubuntu
sudo yum install python-devel mysql-devel # Red Hat / CentOS
حالا دوباره دستور نصب mysqlclient رو امتحان کنید. الان جنگو میتونه با دیتابیس مون ارتباط برقرار کنه.
روش دوم نصب PyMySql هستش که دوستان برنامه نویس میگن ظاهرا ناسازگاره (incompatible)
ولی خب من از PyMySql استفاده میکنم و تا حالا به مشکلی نخوردم.
به هر حال... واسه نصب PyMySql کافیه کامند زیر رو وارد کنید:
$ pip3 install pymysql
بعد از اینکه PyMySql نصب شد باید تو فایل init__.py__ که کنار فایل settings.py قرار داره این کد رو اضافه کنید:
import pymysql pymysql.install_as_MySQLdb()
الان نصب PyMySql تمومه. فقط موقع ران سرور دوتا ارور ممکنه بده. اگه mysqlclient رو نصب کرده باشید و نسخه اش به جنگو نخوره ارور میده. واسه اینکه جلوی این ارور رو بگیرید میتونید mysqlclient رو حذف کنید یا اگه نمیخواید حذفش کنید باید برید تو فایل های جنگو به آدرس
env/lib/python3.5/site_packages/django/db/backends/mysql/base.py
و این قسمت کد رو پیدا کنید:
version = Database.version_info if version < (1, 3, 13): raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; yo u have %s.' % Database.__version__)
قسمت raise رو کامنت کنید و به ادامه اش یه pass اضافه کنید.
یه ارور دیگه هم ممکنه باز از فایل های جنگو بگیرید:
query = query.decode(errors='replace') AttributeError: 'str' object has no attribute 'decode'
برای اینکه جلوی این ارور رو هم بگیرید باید برید تو فایل
env/lib/python3.8/site-packages/django/db/backends/mysql/operations.py
و این قسمت کد رو پیدا کنید:
if query is not None: query = query.decode(errors='replace') return query
قسمت query رو کامنت کنید و به پایینش یه pass اضافه کنید.
و تمام... ?
خب امیدوارم تو نصبش به مشکل نخورید. اگر هم به مشکل خوردید تو قسمت نظرات بهم بگید. اگه کمکی از دستم بر بیاد خوشحال میشم بتونم کاری بکنم.
شاد و خندون باشید. ?