22👍
Just create a symbolic link in /usr/local/lib
sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib
12👍
I’ve recently had this issue when I was trying to install Django and mod_wsgi on my MacBook pro (MacOS Catallina). Setting LD_LIBRARY_PATH, DYLD_LIBRARY_PATH, adding sym link and moving the libmysqlclient.21.dylib to /usr/lib/ didn’t work.
I had to struggle for a few days but finally I got this solution. The thing is I had to modify the library path in the libmysqlclient.21.dylib. Fortunately we have a tool to do it. The culprit was @rpath/libmysqlclient.21.dylib.
It looked like @rpath wasn’t working.
Ok you can check the paths referred in a .so file using otool. It comes with Xcode. This is what you get when you run it on the mysql .so file (should be in the MySQLdb directory under your site-packages).
$ otool -L _mysql.cpython-38-darwin.so
_mysql.cpython-38-darwin.so:
@rpath/libmysqlclient.21.dylib (compatibility version 21.0.0, current version 21.0.0)
libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)
So we modify the filepath in the _mysql.cpython-38-darwin.so. There is a tool for that. It is install_name_tool. I ran these commands. Basically I changed @rpath to absolute path, and also the libssl and the licrypto paths to absolute path.
$ install_name_tool -change @rpath/libmysqlclient.21.dylib /usr/local/mysql/lib/libmysqlclient.21.dylib _mysql.cpython-38-darwin.so
$ install_name_tool -change libssl.1.1.dylib /usr/local/mysql/lib/libssl.1.1.dylib _mysql.cpython-38-darwin.so
$ install_name_tool -change libcrypto.1.1.dylib /usr/local/mysql/lib/libcrypto.1.1.dylib _mysql.cpython-38-darwin.so
My Django worked great after these changes.
- "no such column" after adding a field to the model
- Can't pip install mysql-python
- Django – Perform Raw SQL Update/Delete and return row count
4👍
For me, I’ve got a problem after upgrading the MySQL
version, what worked for me is reinstalling the mysqlclient
python dependency but only when I disabled the cache like pip install --no-cache-dir mysqlclient
because the libmysqlclient.21.dylib
was already removed and replaced by the libmysqlclient.22.dylib
so symlinking doesn’t help in here.
- Mongoengine get latest()
- Django custom manager with ManyToManyField
- How to ignore certain Python errors from Sentry capture
- One project, Multiple customers with git?
3👍
The symlink solution worked for me, but after linking the first file, I got the same error message for a different file name. In total, I had to symlink three different files.
sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib
sudo ln -s /usr/local/mysql/lib/libssl.1.1.dylib /usr/local/lib/libssl.1.1.dylib
sudo ln -s /usr/local/mysql/lib/libcrypto.1.1.dylib /usr/local/lib/libcrypto.1.1.dylib
2👍
So it turns out that I managed to solve my issue albeit in a bit of an unorthodox manner. If anyone else is using mysqlclient with a version of Python 3 and MySQL 8, give this a try and see if it helps! 🙂
I simply made a copy of the libmysqlclient.21.dylib
file located in my installation of MySQL 8.0.13 which is was in /usr/local/mysql/lib
and moved that copy under the same name to /usr/lib
.
You will however need to temporarily disable security integrity protection on your mac to do this since you won’t have or be able to change permissions to anything in /usr/lib
without disabling it. You can do this by booting up into the recovery system, click Utilities on the menu at the top, and open up the terminal and enter csrutil disable
into the terminal. Just remember to turn security integrity protection back on when you’re done doing this! The only difference from the above process will be that you run csrutil enable
instead.
After I did this, I ran my migrations like I did before on the new database and it worked! I honestly don’t know how good of a solution this really is, but so far everything’s been working perfectly since I changed the copy of .dylib
the connector was using. I hope this helps if you also have this issue!
You can read more about how to disable and enable macOS’s security integrity protection here.
- Django ManagementForm data is missing or has been tampered with
- How to avoid creating test database for testing in django?
2👍
Fix for MacOS 14 – Sonoma
After a lot of searching and a difficult time I was able to find a possible answer for any MacOS user. If you are using Sonoma MacOS 14, then here is the step by step.
- Check the exact error thrown and look for the part that start with
ImportError: dlopen(.../_mysql.cpython-310-darwin.so) Library not loaded: /opt/homebrew/opt/mysql/lib/libmysqlclient.21.dylib
This two parts are very important the .so
file where the library is trying to be loaded, and the .dylib
library being loaded.
-
Inside the terminal go to the folder the
so
file is located -
Inside that folder run the command
otool -L _mysql.cpython-310-darwin.so
and search for the current dylib version it’s trying to find
-
Go to the
/opt/homebrew/opt/mysql/lib/
folder and look for your actual file. In my caselibmysqlclient.22.dylib
with a symlink namedlibmysqlclient.dylib
-
Change to the correct file with the command:
install_name_tool -change /opt/homebrew/opt/mysql/lib/{previous}.dylib /opt/homebrew/opt/mysql/lib/libmysqlclient.dylib _mysql.cpython-310-darwin.so
- Review the changes by running the
otool
command again
otool -L _mysql.cpython-310-darwin.so
The output should be:
_mysql.cpython-310-darwin.so:
/opt/homebrew/opt/mysql/lib/libmysqlclient.dylib (compatibility version 21.0.0, current version 21.0.0)
/usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.60.1)
And that will get the error resolved and will let you continue with the migration process in DJango or get the server running again without the 500 error.
- Django how to turn off warning
- Django REST – Create object with foreign key using serializers
- Generate unique hashes for django models
- Real time apps: Socket.io vs Pusherapp
- How to add anchor to django url in template
1👍
My project with Python 3.6 was lookin for libmysqlclient.21.dylib. I installed brew install mysql-client. It installed mysql-client 8.0. it has libmysqlclient.21.dylib. Where as i wanted to use mysql@5.6. So I copied the libmysqlclient.21.dylib from /usr/local/Cellar/mysql-client/8.0.19/lib to /usr/local/lib/
sudo ln -s /usr/local/Cellar/mysql-client/8.0.19/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib
- Configure Django-rest
- Is there a way to set the id value of new Django objects to start at a certain value?
- OSError: dlopen(libSystem.dylib, 6): image not found
- Tiny MCE popups blank in Django admin
0👍
I tried a lot of things but it ended up being as simple as renaming the folder mysql-8.0.26-macos11-x86_64 to "mysql" in usr/local/mysql-8.0.26-macos11-x86_64/lib/libmysqlclient.21.dylib. As soon as I did that, everything worked fine.
0👍
In my case, I found out its the relative path that was the root cause of the problem. so changing this to the absolute path fixed the issue.
Navigate into the directory that has _mysql.cpython-310-darwin.so
file.
Check the path with this command:
otool -L _mysql.cpython-310-darwin.so
In my case this is what was returned
@rpath/libmysqlclient.21.dylib (compatibility version 21.0.0, current version 21.0.0)
Changing this to the absolute path fixed the issue
install_name_tool -change @rpath/libmysqlclient.21.dylib /usr/local/mysql/lib/libmysqlclient.21.dylib _mysql.cpython-310-darwin.so
And now when you check the path again using the same command above
otool -L _mysql.cpython-310-darwin.so
The absolute path should be returned like so
/usr/local/mysql/lib/libmysqlclient.21.dylib (compatibility version 21.0.0, current version 21.0.0)
- Django Check and set permissions for a user group
- How to get a name of last migration programmatically?
- Updating selection of objects, each with a different value in bulk (Django)
- How does django-nose differ from the default Django test-runner