[英]Library not loaded: @rpath/libmysqlclient.21.dylib Reason: image not found Django migrate error using mysqlclient DB driver and MySQL 8 with macOS
While changing to a MySQL database from the default SQLite one that Django uses by default, I ran into this tricky error while trying to run python manage.py migrate --database mysql
:从 Django 默认使用的默认 SQLite 数据库更改为 MySQL 数据库时,我在尝试运行
python manage.py migrate --database mysql
时遇到了这个棘手的错误:
Traceback (most recent call last):
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
import MySQLdb as Database
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/MySQLdb/__init__.py", line 18, in <module>
import _mysql
ImportError: dlopen(/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/_mysql.cpython-37m-darwin.so, 2): Library not loaded: @rpath/libmysqlclient.21.dylib
Referenced from: /Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/_mysql.cpython-37m-darwin.so
Reason: image not found
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 20, in <module>
execute_from_command_line( sys.argv )
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 350, in execute
self.check()
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 379, in check
include_deployment_checks=include_deployment_checks,
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 59, in _run_checks
issues = run_checks(tags=[Tags.database])
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/checks/registry.py", line 71, in run_checks
new_errors = check(app_configs=app_configs)
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/checks/database.py", line 9, in check_database_backends
for conn in connections.all():
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 217, in all
return [self[alias] for alias in self]
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 217, in <listcomp>
return [self[alias] for alias in self]
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 202, in __getitem__
backend = load_backend(db['ENGINE'])
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 110, in load_backend
return import_module('%s.base' % backend_name)
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 20, in <module>
) from err
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
I received this error after having already installed mysqlclient via pip install mysqlclient
and its connector through Homebrew with brew install mysql-connector-c
, so this is a bit of a puzzling error.我已经通过
pip install mysqlclient
了 mysqlclient 并通过 Homebrew 使用brew install mysql-connector-c
安装了 mysqlclient 之后收到了这个错误,所以这是一个有点令人费解的错误。 Even after following the connector instructions by modifying the mysql_config
file in the connector's bin folder, I still ran into this issue.即使按照连接器说明修改连接器 bin 文件夹中的
mysql_config
文件,我仍然遇到了这个问题。 This does appear to be at least somewhat related to that I'm running macOS given the documentation on this connector's known bug.考虑到有关此连接器已知错误的文档,这似乎至少与我正在运行 macOS 在某种程度上有关。
Upon inspecting my stack trace further, I noticed the Library not loaded: @rpath/libmysqlclient.21.dylib
error up near the top.进一步检查我的堆栈跟踪后,我注意到
Library not loaded: @rpath/libmysqlclient.21.dylib
错误在顶部附近。 Shortly after that is another possible clue I found: Reason: image not found
, but I'm not quite sure what that's supposed to mean.不久之后,我发现了另一个可能的线索:
Reason: image not found
,但我不太确定那是什么意思。
I did poke around in /usr/local/Cellar/mysql-connector-c
to see if there was anything possibly missing with the connector I installed, and sure enough, the libmysqlclient.21.dylib
file was missing.我确实在
/usr/local/Cellar/mysql-connector-c
中四处寻找,看看我安装的连接器是否可能缺少任何东西,果然, libmysqlclient.21.dylib
文件丢失了。 In its place was what I assume is an older version of the file since it was named libmysqlclient.18.dylib
.取而代之的是我认为是该文件的旧版本,因为它被命名为
libmysqlclient.18.dylib
。 Out of curiosity, I copied the .dylib
that my MySQL install came with and moved that copy under the same name to the connector's folder and to /usr/local/lib
where I also found another libmysqlclient.18.dylib
file.出于好奇,我复制了我的 MySQL 安装附带的
.dylib
并将该副本以相同的名称移动到连接器的文件夹和/usr/local/lib
,在那里我还找到了另一个libmysqlclient.18.dylib
文件。 However, my migration still failed, but I did get a slightly different stack trace:然而,我的迁移仍然失败,但我确实得到了一个略有不同的堆栈跟踪:
Traceback (most recent call last):
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
import MySQLdb as Database
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/MySQLdb/__init__.py", line 18, in <module>
import _mysql
ImportError: dlopen(/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/_mysql.cpython-37m-darwin.so, 2): Library not loaded: @rpath/libmysqlclient.21.dylib
Referenced from: /Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/_mysql.cpython-37m-darwin.so
Reason: no suitable image found. Did find:
/usr/local/lib/libmysqlclient.21.dylib: file too short
/usr/local/lib/libmysqlclient.21.dylib: file too short
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 20, in <module>
execute_from_command_line( sys.argv )
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv
self.execute(*args, **cmd_options)
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 350, in execute
self.check()
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 379, in check
include_deployment_checks=include_deployment_checks,
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 59, in _run_checks
issues = run_checks(tags=[Tags.database])
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/checks/registry.py", line 71, in run_checks
new_errors = check(app_configs=app_configs)
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/checks/database.py", line 9, in check_database_backends
for conn in connections.all():
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 217, in all
return [self[alias] for alias in self]
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 217, in <listcomp>
return [self[alias] for alias in self]
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 202, in __getitem__
backend = load_backend(db['ENGINE'])
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 110, in load_backend
return import_module('%s.base' % backend_name)
File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 20, in <module>
) from err
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
This time I get the following error:这次我收到以下错误:
Reason: no suitable image found. Did find:
/usr/local/lib/libmysqlclient.21.dylib: file too short
/usr/local/lib/libmysqlclient.21.dylib: file too short
With that, I suspect the problem may have something to do with the .dylib
version that my MySQL connector installed with, but I'm not sure how to fix this exactly.有了这个,我怀疑问题可能与我的 MySQL 连接器安装的
.dylib
版本有关,但我不确定如何正确解决这个问题。 I do find it curious that simply copying a file over managed to change my stack trace ever so slightly so I guess I ought to look into that more.我确实觉得很奇怪,简单地复制一个文件就可以稍微改变我的堆栈跟踪,所以我想我应该多研究一下。 Thoughts?
想法?
只需在 /usr/local/lib 中创建一个符号链接
sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib
I've recently had this issue when I was trying to install Django and mod_wsgi on my MacBook pro (MacOS Catallina).我最近在尝试在 MacBook pro (MacOS Catallina) 上安装 Django 和 mod_wsgi 时遇到了这个问题。 Setting LD_LIBRARY_PATH, DYLD_LIBRARY_PATH, adding sym link and moving the libmysqlclient.21.dylib to /usr/lib/ didn't work.
设置 LD_LIBRARY_PATH、DYLD_LIBRARY_PATH、添加符号链接并将 libmysqlclient.21.dylib 移动到 /usr/lib/ 不起作用。 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 .
问题是我必须修改libmysqlclient.21.dylib 中的库路径。 Fortunately we have a tool to do it.
幸运的是,我们有一个工具可以做到这一点。 The culprit was @rpath/libmysqlclient.21.dylib .
罪魁祸首是@rpath/libmysqlclient.21.dylib 。 It looked like @rpath wasn't working.
看起来@rpath不起作用。
Ok you can check the paths referred in a .so file using otool .好的,您可以使用otool检查 .so 文件中引用的路径。 It comes with Xcode.
它随 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).
这是在 mysql .so 文件(应该在站点包下的 MySQLdb 目录中)上运行它时得到的结果。
$ 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.所以我们修改了_mysql.cpython-38-darwin.so中的文件路径。 There is a tool for that.
有一个工具可以做到这一点。 It is install_name_tool .
它是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.
基本上我将@rpath 更改为绝对路径,并将 libssl 和 licrypto 路径更改为绝对路径。
$ 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.在这些更改后,我的 Django 运行良好。
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!
如果其他人正在将 mysqlclient 与 Python 3 和 MySQL 8 版本一起使用,请尝试一下,看看是否有帮助! :)
:)
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
.我只是复制了位于我的 MySQL 8.0.13 安装中的
libmysqlclient.21.dylib
文件,该文件位于/usr/local/mysql/lib
并将该副本以相同的名称移动到/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.但是,您需要暂时禁用 mac 上的安全完整性保护才能执行此操作,因为如果不禁用它,您将无法或无法更改
/usr/lib
任何内容的权限。 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.您可以通过启动进入恢复系统来执行此操作,单击顶部菜单上的实用程序,然后打开终端并在终端中输入
csrutil disable
。 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.与上述过程的唯一区别是您改为运行
csrutil enable
。
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.老实说,我不知道这真的是一个多么好的解决方案,但到目前为止,自从我更改了连接器正在使用的
.dylib
副本以来,一切都运行良好。 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 .您可以在此处阅读有关如何禁用和启用 macOS 的安全完整性保护的更多信息。
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
My project with Python 3.6 was lookin for libmysqlclient.21.dylib.我的 Python 3.6 项目正在寻找 libmysqlclient.21.dylib。 I installed brew install mysql-client.
我安装了 brew install mysql-client。 It installed mysql-client 8.0.
它安装了 mysql-client 8.0。 it has libmysqlclient.21.dylib.
它有 libmysqlclient.21.dylib。 Where as i wanted to use mysql@5.6.
我想在哪里使用 mysql@5.6。 So I copied the libmysqlclient.21.dylib from /usr/local/Cellar/mysql-client/8.0.19/lib to /usr/local/lib/
所以我将 libmysqlclient.21.dylib 从 /usr/local/Cellar/mysql-client/8.0.19/lib 复制到 /usr/local/lib/
sudo ln -s /usr/local/Cellar/mysql-client/8.0.19/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib
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.我尝试了很多东西,但最终就像在 usr/local/mysql-8.0.26-macos11-x86_64/lib/libmysqlclient.21 中将文件夹 mysql-8.0.26-macos11-x86_64 重命名为“mysql”一样简单.dylib。 As soon as I did that, everything worked fine.
一旦我这样做了,一切正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.