Thursday, July 23, 2020

How to fix the Library not loaded: @rpath/libmysqlclient.21.dylib error in Django for Mac users

There seems to be some problems with macOS Mojave and Catalina users when trying to connect a Django project to a MySQL database.

ImportError: dlopen(, 2): Library not loaded: @rpath/libmysqlclient.21.dylib
  Referenced from: .../site-packages/
  Reason: image not found
NameError: name '_mysql' is not defined

Python seems to be unable to resolve the path to libmysqlclient.21.dylib. One solution is to create a symlink to libmysqlclient.21.dylib in either /usr/local/lib/ or /usr/lib/. You can do so by running this in Terminal:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib

But this doesn't always seem to work. Another solution is to change the path to libmysqlclient.21.dylib specified in (could be 37 or some other number depending on your Python version). Change it to an absolute path that points to  /usr/local/mysql/lib/libmysqlclient.21.dylib. can be found in the MySQLdb directory in site-packages. You can use some Xcode command line tools to fix this. Open a terminal window in the directory that contains and perform the following:

To check the path:
otool -L

It's the relative path that seems to be problematic. Command above should output something like this:
    @rpath/libmysqlclient.21.dylib (compatibility version 21.0.0, current version 21.0.0)

Change the relative path to absolute by running this:
install_name_tool -change @rpath/libmysqlclient.21.dylib /usr/local/mysql/lib/libmysqlclient.21.dylib