未加载库:@rpath/libmysqlclient.21.dylib原因:使用mysqlclient DB driver和MySQL 8 with m时找不到映像Django迁移错误

2024-10-02 00:37:31 发布

您现在位置:Python中文网/ 问答频道 /正文

当从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?

我已经通过pip install mysqlclient安装了mysqlclient,并通过自制的brew install mysql-connector-c安装了它的连接器,因此这是一个令人费解的错误。Even after following the connector instructions通过修改连接器bin文件夹中的mysql_config文件,我仍然遇到了这个问题。这似乎至少与我运行macOS有点关系,因为有关于这个连接器已知错误的文档。在

在进一步检查堆栈跟踪之后,我注意到了顶部附近的Library not loaded: @rpath/libmysqlclient.21.dylib错误。不久之后,我发现了另一个可能的线索:Reason: image not found,但我不太确定这是什么意思。在

我确实在/usr/local/Cellar/mysql-connector-c中查看了我安装的连接器是否有任何可能丢失的东西,果然,libmysqlclient.21.dylib文件丢失了。取而代之的是我认为文件的旧版本,因为它被命名为libmysqlclient.18.dylib。出于好奇,我复制了MySQL安装附带的.dylib,并用相同的名称将该副本移动到连接器的文件夹和/usr/local/lib中,在那里我还发现了另一个libmysqlclient.18.dylib文件。但是,我的迁移仍然失败,但是我得到了一个稍微不同的堆栈跟踪:

^{pr2}$

这次我得到了以下错误:

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

因此,我怀疑这个问题可能与MySQL连接器安装的.dylib版本有关,但我不确定如何确切地修复这个问题。我确实觉得很奇怪,简单地复制一个文件就可以稍微改变我的堆栈跟踪,所以我想我应该对此进行更多的研究。思想?在


Tags: djangoinpylibpackageslinemysqlsite
2条回答

只需在/usr/local/lib中创建一个符号链接

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

所以结果我设法解决了我的问题,尽管有点非正统。如果其他人正在使用mysqlclient与python3和MySQL 8的版本,请尝试一下,看看是否有帮助!:)

我只是简单地复制了libmysqlclient.21.dylib文件,该文件位于MySQL 8.0.13的安装中,该文件位于/usr/local/mysql/lib中,并将该副本以相同的名称移动到/usr/lib。在

但是,您需要暂时禁用mac上的安全完整性保护才能执行此操作,因为您将无法或无法更改对/usr/lib中任何内容的权限而不禁用它。您可以启动恢复系统,单击顶部菜单上的实用程序,打开终端并在终端中输入csrutil disable。只需记住,完成此操作后,请重新启用安全完整性保护!与上述过程的唯一区别是您将运行csrutil enable。在

在我完成这项工作之后,我像以前一样在新数据库上运行迁移,它成功了!老实说,我不知道这个解决方案到底有多好,但自从我更改了连接器使用的.dylib的副本以来,一切都工作得很好。如果你也有这个问题,我希望这有帮助!在

您可以阅读更多关于如何禁用和启用macOS的安全完整性保护here。在

相关问题 更多 >

    热门问题