В Django изначально реализована поддержка баз данных MySQL и MariaDB. Общение с этими базами выполняется через разные библиотеки, в том числе mysqlclient. Библиотека mysqlclient является самой быстрой и рекомендуемой при работе с Django и MySQL, но ее установка не всегда очевидна и вы можете столкнуться с рядом проблем.
Библиотеки для работы с MySQL в Python
Скорее всего их больше, какие-то библиотеки более не поддерживаются, но обычно выделяют 3 варианта для работы с базами MySQL в Python:
- mysqclient - библиотека написанная на С, которая компилируется при установке. Является форком старого проекта MySQLdb1, который давно не поддерживается. Рекомендуется разработчиками Django и имеет самые высокие показатели производительности из остальных;
- mysql-connector-python - это официальная библиотека от Oracle. На момент написания статьи можно встретить информацию, что разработчики переписали ее на Python 3, но это не так. Библиотека написана на Python 2.7, а поддержка этой версии закончилась в Django 2.0. В документации Django, почему-то, до сих пор можно прочитать о поддержке этого модуля. Библиотека имела самые низкие показатели скорости;
- pymysql - сторонний проект написанные на Python 3. Django официально не поддерживает эту библиотеку. Создана теми же разработчиками, что и mysqlclient.
При установке библиотеки mysqlclient, на любой платформе (особенно на Windows), могут быть проблемы с компиляцией. Часть ошибок, которые у вас могут появиться:
- django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient?
- building '_mysql' extension error: Microsoft Visual C++ 14.0 is required.
- ModuleNotFoundError: No module named ‘MySQLdb’
Если у вас есть похожие проблемы, то я бы рекомендовал использовать mysqlclient на сервере (как самую быструю библиотеку), а pymysql использовать локально. О том как это сделать и как можно исправить ошибки написано далее.
Само собой статья исключает ситуацию, что вы можете использовать PostgreSQL в своем проекте.
pymysql
Самый простой и быстрый способ исправить ошибку - установить библиотеку pymysql:
python3 -m pip install PyMySQL
Что бы вы смогли использовать ее в Django, в файле settings.py вам нужно импортировать библиотеку и использовать метод для подключения к API MySQLdb:
import pymysql
pymysql.install_as_MySQLdb()
Эти настройки может понадобится положить в другие файлы, такие как '__init__.py' или 'manage.py'. Это зависит от вашего проекта. Суть в том, что мы должны импортировать pymysql до того, как будет выполнен импорт MySQLdb. Обычно это происходит в 'settings.py' в DATABASES.
Ниже пример файла настроек, который использую я при локальной разработке:
На странице проекта в github есть уточнение, которое касалось версий Django 2.2+ и следующей ошибкой:
- django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3;
Я эту ошибку не встречал, но исправить ее можно вручную заменив версию mysqlclient следующим образом:
import pymysql
pymysql.version_info = (1, 4, 6, 'final', 0)
pymysql.install_as_MySQLdb()
Каких либо ошибок при работе с этой библиотекой я не замечал.
mysqlclient
Перед установкой библиотеки mysqclient, в случае Linux, вам понадобится установить целый ряд дополнительных пакетов для компиляции:
# Разработчики указывают следующие пакеты
# Ubuntu
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
# CentOS
sudo yum install python3-devel mysql-devel
# библиотеки, которые могут понадобится
# (советы с форумов, которые мне не пригодились)
sudo apt-get install mysql-client libssl-dev
В качестве эксперимента я установил чистый Windows 10 и Django 3.2 и ошибок с mysqlclient не было. Возможно разработчики что-то исправили. Если на Windows у вас все равно появляются ошибки, то вы можете скачать скомпилированную версию и установить ее через pip:
python3 -m pip install C:/mysqlclient-1.4.6-cp39-cp39-win32.whl
В случае Windows этот способ у меня не всегда срабатывал. Поэтому я предпочитаю, если использую MySQL, использовать PyMySQL локально, а mysqlclient на сервере.
Далее устанавливаем саму библиотеку через pip:
python3 -m pip install mysqlclient
mysql-connector-python
Эта официальная библиотека от разработчиков Oracle написанная на Python 2.7. Эта библиотека так же поддерживается разработчиками Django. В более новых версиях Django 3+ можно увидеть следующую ошибку:
- 'mysql.connector.django' isn't an available database backend or couldn't be imported. Check the above exception. To use one of the built-in backends, use 'django.db.backends.XXX', where XXX is one of: 'mysql', 'oracle', 'postgresql', 'sqlite3'
В Django 2.2 можно увидеть следующую ошибку:
- django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient?
Эти ошибки связаны с отсутствием поддержки Python 2.7 начиная с Django 2.0. В марте 2020 года (прошел год с написания статьи) разработчики отписывались о том что в курсе этой проблемы и решают ее. Вы можете попытать удачу и установить этот модуль следующим образом:
python3 -m pip install mysql-connector-python
В файле setting.py указать следующие настройки:
DATABASES = {
'default': {
'ENGINE': 'mysql.connector.django',
'NAME': ,
'USER': ,
'PASSWORD': ,
'HOST': ,
}
}
...