В 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': ,
}
}
…
Теги:
#python
#django
I installed Python 2.7.15rci and Python 3.6.7 on Ubuntu. When i did ‘pip list’ on virtualenv it returns me:
Django (2.1.5)
pip (9.0.1)
pkg-resources (0.0.0)
pytz (2018.9)
setuptools (39.0.1)
wheel (0.32.3)
I’m trying to install mysqlclient (pip install mysqlclient) and returns an error.
unable to execute 'x86_64-linux-gnu-gcc': No such file or directory
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
Failed building wheel for mysqlclient
Running setup.py clean for mysqlclient
Failed to build mysqlclient
Installing collected packages: mysqlclient
Running setup.py install for mysqlclient ... error
Complete output from command /home/david/env/project/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-pq18uxjj/mysqlclient/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('rn', 'n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-y28h4ou0-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/david/env/project/include/site/python3.6/mysqlclient:
/usr/lib/python3.6/distutils/dist.py:261: UserWarning: Unknown distribution option: 'long_description_content_type'
warnings.warn(msg)
running install
running build
running build_py
creating build
creating build/lib.linux-x86_64-3.6
creating build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/__init__.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/_exceptions.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/compat.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/connections.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/converters.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/cursors.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/release.py -> build/lib.linux-x86_64-3.6/MySQLdb
copying MySQLdb/times.py -> build/lib.linux-x86_64-3.6/MySQLdb
creating build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/__init__.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/CLIENT.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/CR.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/ER.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/FIELD_TYPE.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
copying MySQLdb/constants/FLAG.py -> build/lib.linux-x86_64-3.6/MySQLdb/constants
running build_ext
building 'MySQLdb._mysql' extension
creating build/temp.linux-x86_64-3.6
creating build/temp.linux-x86_64-3.6/MySQLdb
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Dversion_info=(1,4,1,'final',0) -D__version__=1.4.1 -I/usr/include/mysql -I/home/david/env/project/include -I/usr/include/python3.6m -c MySQLdb/_mysql.c -o build/temp.linux-x86_64-3.6/MySQLdb/_mysql.o
unable to execute 'x86_64-linux-gnu-gcc': No such file or directory
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
Command "/home/david/env/project/bin/python3 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-pq18uxjj/mysqlclient/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('rn', 'n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-y28h4ou0-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/david/env/project/include/site/python3.6/mysqlclient" failed with error code 1 in /tmp/pip-build-pq18uxjj/mysqlclient/
So, I have tried different methods found like:
sudo apt-get install python-dev
sudo apt-get install python3-dev
sudo apt-get install libmysqlclient-dev
and some more… but none of them work for me and the problem persists.
Any suggestions?
Thank you!
I am trying to install mysqlclient with pip but it keeps giving me error message,
I already have the development from sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
,
or use this step :
LDFLAGS=-L/usr/local/opt/openssl/lib pip install mysqlclient
, and this sudo apt-get install libmariadb-dev-compat libmariadb-dev libssl-dev
and in the end i always get this : Building wheel for mysqlclient (setup.py) ... error error: subprocess-exited-with-error
, i use python ver 3.10.4 as main, but i have another version (2.7.18, 3.8.10 and 3.9.5),
if i try to download pip install mysqlclient using anaconda, will it cause other problems because i already have python?
this is my whole output
Collecting mysqlclient
Using cached mysqlclient-2.1.0.tar.gz (87 kB)
Preparing metadata (setup.py) ... done
Building wheels for collected packages: mysqlclient
Building wheel for mysqlclient (setup.py) ... error
error: subprocess-exited-with-error
× python setup.py bdist_wheel did not run successfully.
│ exit code: 1
╰─> [44 lines of output]
mysql_config --version
['10.4.24']
mysql_config --libs
['-L/opt/lampp/lib/', '-lmariadb']
mysql_config --cflags
['-I/opt/lampp/include/mysql', '-I/opt/lampp/include/mysql/mysql']
ext_options:
library_dirs: ['/opt/lampp/lib/']
libraries: ['mariadb']
extra_compile_args: ['-std=c99']
extra_link_args: []
include_dirs: ['/opt/lampp/include/mysql', '/opt/lampp/include/mysql/mysql']
extra_objects: []
define_macros: [('version_info', "(2,1,0,'final',0)"), ('__version__', '2.1.0')]
running bdist_wheel
running build
running build_py
creating build
creating build/lib.linux-x86_64-cpython-310
creating build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/__init__.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/_exceptions.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/connections.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/converters.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/cursors.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/release.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/times.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
creating build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/__init__.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/CLIENT.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/CR.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/ER.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/FIELD_TYPE.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/FLAG.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
running build_ext
building 'MySQLdb._mysql' extension
creating build/temp.linux-x86_64-cpython-310
creating build/temp.linux-x86_64-cpython-310/MySQLdb
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -fPIC -Dversion_info=(2,1,0,'final',0) -D__version__=2.1.0 -I/opt/lampp/include/mysql -I/opt/lampp/include/mysql/mysql -I/home/aqila/venv/include -I/usr/include/python3.10 -c MySQLdb/_mysql.c -o build/temp.linux-x86_64-cpython-310/MySQLdb/_mysql.o -std=c99
MySQLdb/_mysql.c:29:10: fatal error: mysql.h: No such file or directory
29 | #include "mysql.h"
| ^~~~~~~~~
compilation terminated.
error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for mysqlclient
Running setup.py clean for mysqlclient
Failed to build mysqlclient
Installing collected packages: mysqlclient
Running setup.py install for mysqlclient ... error
error: subprocess-exited-with-error
× Running setup.py install for mysqlclient did not run successfully.
│ exit code: 1
╰─> [46 lines of output]
mysql_config --version
['10.4.24']
mysql_config --libs
['-L/opt/lampp/lib/', '-lmariadb']
mysql_config --cflags
['-I/opt/lampp/include/mysql', '-I/opt/lampp/include/mysql/mysql']
ext_options:
library_dirs: ['/opt/lampp/lib/']
libraries: ['mariadb']
extra_compile_args: ['-std=c99']
extra_link_args: []
include_dirs: ['/opt/lampp/include/mysql', '/opt/lampp/include/mysql/mysql']
extra_objects: []
define_macros: [('version_info', "(2,1,0,'final',0)"), ('__version__', '2.1.0')]
running install
/home/aqila/venv/lib/python3.10/site-packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
warnings.warn(
running build
running build_py
creating build
creating build/lib.linux-x86_64-cpython-310
creating build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/__init__.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/_exceptions.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/connections.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/converters.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/cursors.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/release.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
copying MySQLdb/times.py -> build/lib.linux-x86_64-cpython-310/MySQLdb
creating build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/__init__.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/CLIENT.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/CR.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/ER.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/FIELD_TYPE.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
copying MySQLdb/constants/FLAG.py -> build/lib.linux-x86_64-cpython-310/MySQLdb/constants
running build_ext
building 'MySQLdb._mysql' extension
creating build/temp.linux-x86_64-cpython-310
creating build/temp.linux-x86_64-cpython-310/MySQLdb
x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -fPIC -Dversion_info=(2,1,0,'final',0) -D__version__=2.1.0 -I/opt/lampp/include/mysql -I/opt/lampp/include/mysql/mysql -I/home/aqila/venv/include -I/usr/include/python3.10 -c MySQLdb/_mysql.c -o build/temp.linux-x86_64-cpython-310/MySQLdb/_mysql.o -std=c99
MySQLdb/_mysql.c:29:10: fatal error: mysql.h: No such file or directory
29 | #include "mysql.h"
| ^~~~~~~~~
compilation terminated.
error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
[end of output]
note: This error originates from a subprocess, and is likely not a problem with pip.
error: legacy-install-failure
× Encountered error while trying to install package.
╰─> mysqlclient
note: This is an issue with the package mentioned above, not pip.
hint: See above for output from the failure.```
How to use mySqlclient
To use this service, you have to install it through the Python package installer pip
, as shown below:
pip install mysqlclient
This command will automatically download and install the mysqlclient
package into your device. However, this process is not always problem-free due to some reasons, like pip
trying to install the latest version that might not match properly with your system.
If a problem arises, pip
will throw an error with a message like mysqliclient installation error
.
I want to install MySQL on my Ubuntu 20.10 desktop, but I’m facing issues.
I tried installing python3-dev
and libmysqlclient-dev
.
When running:
pip3 install mysqlclient
I keep getting the error below:
How may I solve this?
asked Mar 4, 2021 at 18:33
1
Check this thread, maybe it helps you.
Error installing libmysqlclient-dev on Ubuntu 20.04
Step 0: sudo apt install python3-dev build-essential
Step 1: sudo apt install libssl1.1
Step 2: sudo apt install libssl1.1=1.1.1f-1ubuntu2
Step 3: sudo apt install libssl-dev
Step 4: sudo apt install libmysqlclient-dev
Step 5: pip3 install mysqlclient
That’s it!
ps: To find out these all steps, I was spent almost 4-5 Hours.
answered Apr 16, 2021 at 19:35
1
As mentioned here you should do:
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
Debian / Ubuntusudo yum install python3-devel mysql-devel
Red Hat / CentOS
After that just do pip install mysqlclient
answered Aug 5, 2021 at 11:40
1
This can usually be resolved with the libffi-dev
libraries; libffi.so
specifically. It can be installed via apt
with:
sudo apt install libffi-dev
Note: I have not found a way to install this via pip3
. Do let me know if you find it somewhere.
Once libffi-dev
is installed, run ldconfig
to load the new .so
.
Important: If you compiled your own Python installation, then you will need to recompile it for libffi-dev
to be loaded.
answered Mar 4, 2021 at 23:59
If you are having trouble while setting up virtual environment then do mention python version:
sudo apt-get install python3.5-dev
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo apt-get install libssl-dev
answered Aug 11, 2021 at 11:15