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(..._mysql.cpython-38-darwin.so, 2): Library not loaded: @rpath/libmysqlclient.21.dylib Referenced from: .../site-packages/_mysql.cpython-38-darwin.so 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 _mysql.cpython-38-darwin.so (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.
_mysql.cpython-38-darwin.so 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 _mysql.cpython-38-darwin.so and perform the following:
To check the path:
otool -L _mysql.cpython-38-darwin.so
It's the relative path that seems to be problematic. Command above should output something like this:
_mysql.cpython-38-darwin.so: @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 _mysql.cpython-38-darwin.so