10

I am building a django app and for which i need to configure mysql.I am trying to install mysqlclient module for sql connection and this is what i am trying

pip install mysqlclient --no-cache-dir

It is throwing me following error.It is throwing error while linking to gcc library.

Collecting mysqlclient
  Downloading mysqlclient-1.3.12.tar.gz (89kB)
    100% |################################| 92kB 4.0MB/s 
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... error
    Complete output from command /home/admin/awx.varadev.com/awxenv/bin/python2 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-6m2TNP/mysqlclient/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-WFoARo-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/admin/awx.varadev.com/awxenv/include/site/python2.7/mysqlclient:
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-2.7
    copying _mysql_exceptions.py -> build/lib.linux-x86_64-2.7
    creating build/lib.linux-x86_64-2.7/MySQLdb
    copying MySQLdb/__init__.py -> build/lib.linux-x86_64-2.7/MySQLdb
    copying MySQLdb/compat.py -> build/lib.linux-x86_64-2.7/MySQLdb
    copying MySQLdb/connections.py -> build/lib.linux-x86_64-2.7/MySQLdb
    copying MySQLdb/converters.py -> build/lib.linux-x86_64-2.7/MySQLdb
    copying MySQLdb/cursors.py -> build/lib.linux-x86_64-2.7/MySQLdb
    copying MySQLdb/release.py -> build/lib.linux-x86_64-2.7/MySQLdb
    copying MySQLdb/times.py -> build/lib.linux-x86_64-2.7/MySQLdb
    creating build/lib.linux-x86_64-2.7/MySQLdb/constants
    copying MySQLdb/constants/__init__.py -> build/lib.linux-x86_64-2.7/MySQLdb/constants
    copying MySQLdb/constants/CLIENT.py -> build/lib.linux-x86_64-2.7/MySQLdb/constants
    copying MySQLdb/constants/CR.py -> build/lib.linux-x86_64-2.7/MySQLdb/constants
    copying MySQLdb/constants/ER.py -> build/lib.linux-x86_64-2.7/MySQLdb/constants
    copying MySQLdb/constants/FIELD_TYPE.py -> build/lib.linux-x86_64-2.7/MySQLdb/constants
    copying MySQLdb/constants/FLAG.py -> build/lib.linux-x86_64-2.7/MySQLdb/constants
    copying MySQLdb/constants/REFRESH.py -> build/lib.linux-x86_64-2.7/MySQLdb/constants
    running build_ext
    building '_mysql' extension
    creating build/temp.linux-x86_64-2.7
    gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -D_GNU_SOURCE -fPIC -fwrapv -fPIC -Dversion_info=(1,3,12,'final',0) -D__version__=1.3.12 -I/usr/include/mysql -I/usr/include/python2.7 -c _mysql.c -o build/temp.linux-x86_64-2.7/_mysql.o
    In file included from /usr/include/python2.7/pyconfig.h:6:0,
                     from /usr/include/python2.7/Python.h:8,
                     from _mysql.c:32:
    /usr/include/python2.7/pyconfig-64.h:1188:0: warning: "_POSIX_C_SOURCE" redefined [enabled by default]
     #define _POSIX_C_SOURCE 200112L
     ^
    In file included from /usr/include/sys/types.h:25:0,
                     from /usr/include/mysql/mysql.h:38,
                     from _mysql.c:29:
    /usr/include/features.h:168:0: note: this is the location of the previous definition
     # define _POSIX_C_SOURCE 200809L
     ^
    In file included from /usr/include/python2.7/pyconfig.h:6:0,
                     from /usr/include/python2.7/Python.h:8,
                     from _mysql.c:32:
    /usr/include/python2.7/pyconfig-64.h:1210:0: warning: "_XOPEN_SOURCE" redefined [enabled by default]
     #define _XOPEN_SOURCE 600
     ^
    In file included from /usr/include/sys/types.h:25:0,
                     from /usr/include/mysql/mysql.h:38,
                     from _mysql.c:29:
    /usr/include/features.h:170:0: note: this is the location of the previous definition
     # define _XOPEN_SOURCE 700
     ^
    gcc -pthread -shared -Wl,-z,relro build/temp.linux-x86_64-2.7/_mysql.o -L/usr/lib64 -L/usr/lib64 -lmariadb -lpthread -lz -ldl -lm -lssl -lcrypto -lpython2.7 -o build/lib.linux-x86_64-2.7/_mysql.so
    /usr/bin/ld: cannot find -lmariadb
    collect2: error: ld returned 1 exit status
    error: command 'gcc' failed with exit status 1

    ----------------------------------------
Command "/home/admin/awx.varadev.com/awxenv/bin/python2 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-6m2TNP/mysqlclient/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-WFoARo-record/install-record.txt --single-version-externally-managed --compile --install-headers /home/admin/awx.varadev.com/awxenv/include/site/python2.7/mysqlclient" failed with error code 1 in /tmp/pip-build-6m2TNP/mysqlclient/

is this gcc default feature to link a library file for mysql? I have googled on this and it showing that gcc needs as .so file which i need to symlink with some location.I am running mariadb 10.9 on my server and i did not find any such file in my system.

1
  • Is there a reason you can't get the client from the CentOS package repository (e.g. via yum install MySQL-python) instead of installing through pip? Commented Sep 29, 2017 at 21:36

6 Answers 6

22

Solved in CentOS 7 + MariaDB 10.2

I'm having same issue, and I would like to contribute with my answer. I've just installed in my 2 servers running CentOS 7 with MariaDB (10.2.14-MariaDB MariaDB Server) .

$ cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)

$ mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is XXXX
Server version: 10.2.14-MariaDB MariaDB Server

I've installed MariaDB, this packages:

$ yum list installed | grep mariadb
MariaDB-client.x86_64                   10.3.13-1.el7.centos           @mariadb
MariaDB-common.x86_64                   10.3.13-1.el7.centos           @mariadb
MariaDB-compat.x86_64                   10.3.13-1.el7.centos           @mariadb
MariaDB-server.x86_64                   10.3.13-1.el7.centos           @mariadb
galera.x86_64                           25.3.25-1.rhel7.el7.centos     @mariadb

I found that the problem is that mysqlclient requires mysql-devel packages, which is different from mariadb-devel. Don't install mariadb-devel!

So, to install only mysql-devel, you need to:

1. Remove any MariaDB-devel

$ sudo yum erase MariaDB-devel.x86_64

2. Add MySQL repository in yum

  1. Go to https://dev.mysql.com/downloads/repo/yum/ and select the RPM file for your CentOS (for me, I choose "Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package". Click "download".)
  2. Download without registration, copy bottom link "No thanks, just start my download".
  3. Go to your terminal and type:
$ wget link-to-rpm-you-choose
  1. After download complete, type:
$ sudo rpm -Uvh your-rpm-downloaded

3. Now, install mysql-devel

  1. Type (this is my version, watch yours):
$ sudo yum install mysql-community-devel.x86_64

4. Now, finally: mysqlclient

  1. Type:
$  sudo pip install mysqlclient
Collecting mysqlclient
  Cache entry deserialization failed, entry ignored
  Cache entry deserialization failed, entry ignored
  Downloading https://files.pythonhosted.org/packages/f4/f1/3bb6f64ca7a429729413e6556b7ba5976df06019a5245a43d36032f1061e/mysqlclient-1.4.2.post1.tar.gz (85kB)
    100% |████████████████████████████████| 92kB 758kB/s
Installing collected packages: mysqlclient
  Running setup.py install for mysqlclient ... done
Successfully installed mysqlclient-1.4.2.post1
You are using pip version 8.1.2, however version 19.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

And that's it! It worked like a charm and now I can use Python + Django + MariaDB/MySQL

Oh, and mysqlclient is the connector recommended by Django. See: https://docs.djangoproject.com/en/2.1/ref/databases/#mysql-db-api-drivers

Good luck and see ya! :-)

Sign up to request clarification or add additional context in comments.

Comments

8

I found this solution at https://github.com/r-dbi/RMySQL/issues/197:

The MariaDB-devel-10.2.6-1.fc25.x86_64 package contains only a library named:

/usr/lib64/libmariadbclient.a

However their pkg-config yields another name:

> pkg-config --libs mariadb
    -lmariadb

A workaround is to symlink libmariadbclient.a to libmariadb.a:

sudo ln -s /usr/lib64/libmariadbclient.a /usr/lib64/libmariadb.a

Basically to have mysqlclient install in Python 3.6 and CentOS 7 you need to run:

sudo yum install -y python36-devel mysql-devel gcc

sudo ln -s /usr/lib64/libmariadbclient.a /usr/lib64/libmariadb.a

pip install mysqlclient

Comments

4

The simplest solution that worked for me is:

yum install python-devel mysql-devel

Then install mysqlclient using pip

pip install mysqlclient

1 Comment

This worked for me. I'm using CentOS 7.9.2009. and MariaDB version: 10.11.2-MariaDB. Thank you.
3

It's complaining about not being able to find mariadb libs. Run the following to find out why:

ld -lmariadb --verbose

This should tell you specifically what gcc is missing.

My guess is that you are missing some MySQL development headers. Install them with:

debian / ubuntu: sudo apt-get install python-dev libmysqlclient-dev
redhat / centos: sudo yum install python-devel mysql-devel

Update: It really is missing MariaDB shared libs. I think on CentOS, this should take care of it:

sudo yum install MariaDB-devel

Final Update: Just use PyMySQL - pure python, no headers required, no need to jump through these kinds of hoops.

8 Comments

My question is how to install all these files not to check whether this is installed or not because this command is giving me this cannot find -lzlib
I mistyped the ld commend - try it again :)
Sorry but no success.got this response : Failed to set locale, defaulting to C Package python-devel-2.7.5-58.el7.x86_64 already installed and latest version Package MariaDB-devel-10.2.9-1.el7.centos.x86_64 already installed and latest version Nothing to do
ld: cannot find -lmariadb
@AtulAgrawal - I guess then you need to install them - I updated my answer but sudo yum install MariaDB-devel
|
2

Open the terminal or login to the workstation/laptop/dev-server using ssh client. Type the following command yum command as a root user:

# yum install mysql
Loaded plugins: downloadonly, fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: mirror.wiredtree.com
 * extras: mirrors.serveraxis.net
 * updates: bay.uchicago.edu
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package mysql.x86_64 0:5.1.71-1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch             Version                  Repository      Size
================================================================================
Installing:
 mysql           x86_64           5.1.71-1.el6             base           893 k

Transaction Summary
================================================================================
Install       1 Package(s)

Total download size: 893 k
Installed size: 2.4 M
Is this ok [y/N]: y
Downloading Packages:
mysql-5.1.71-1.el6.x86_64.rpm                            | 893 kB     00:00     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : mysql-5.1.71-1.el6.x86_64                                    1/1 
  Verifying  : mysql-5.1.71-1.el6.x86_64                                    1/1 

Installed:
  mysql.x86_64 0:5.1.71-1.el6                                                   

Complete!

mysql client the basic syntax is:

mysql -u USER-NAME-HERE -h MYSQL-DB-SERVER-IP-ADDRESS-HERE -p DB-NAME
mysql -u nixcraft -h server1.cyberciti.biz -p salesdata

2 Comments

This is response that i got Failed to set locale, defaulting to C Package MariaDB-client-10.2.9-1.el7.centos.x86_64 already installed and latest version Nothing to do
put the following locale relating setting in /etc/bashrc (for all users, bash): export LANG=en_US.UTF-8 export LANGUAGE=en_US.UTF-8 export LC_COLLATE=C export LC_CTYPE=en_US.UTF-8 then run: source /etc/bashrc or log off and log on.
0

After this:

sudo yum install mariadb-devel

I was able to install mysql client with:

pip install mysqlclient

Environment: Centos 7, MariaDB

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.