Ошибка при установке mysqlclient python

В 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.

Ниже пример файла настроек, который использую я при локальной разработке:

Подключение библиотеки PyMySql в Django

На странице проекта в 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:

pip3 install mysqlclient error

How may I solve this?

BeastOfCaerbannog - On strike's user avatar

asked Mar 4, 2021 at 18:33

Shivangi Varshney's user avatar

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. :D

answered Apr 16, 2021 at 19:35

shivang patel's user avatar

1

As mentioned here you should do:

  • sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
    Debian / Ubuntu
  • sudo yum install python3-devel mysql-devel
    Red Hat / CentOS

After that just do pip install mysqlclient

answered Aug 5, 2021 at 11:40

Josef Frola's user avatar

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

Lakpa Sherpa's user avatar

Понравилась статья? Поделить с друзьями:
  • Ошибка при установке mysql на ubuntu server
  • Ошибка при установке mysql на debian
  • Ошибка при установке mta province
  • Ошибка при установке msvcrt dll
  • Ошибка при установке msi пакетов