avatar

刘刚刚的blog

采菊东篱下,悠然见南山🦥

  • 首页
  • 大模型应用
  • 常用软件/工具
  • Halo
  • 关于
Home 一次mac环境下,dango4.2报错的问题
文章

一次mac环境下,dango4.2报错的问题

Posted 2024-08-6 Updated 2024-08- 6
By Administrator
8~11 min read

在升级至django4.2后,mysql连接报错如下

MySQLdb.OperationalError: (2059, "Authentication plugin 'mysql_native_password' cannot be loaded: dlopen(/usr/local/Cellar/mysql/9.0.1/lib/plugin/mysql_native_password.so, 0x0002): tried: '/usr/local/Cellar/mysql/9.0.1/lib/plugin/mysql_native_password.so' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/Cellar/mysql/9.0.1/lib/plugin/mysql_native_password.so' (no such file), '/usr/local/Cellar/mysql/9.0.1/lib/plugin/mysql_native_password.so' (no such file)")

结果:

在经过好几个小时的排查,最后发现问题的原因是pip安装mysqlclient时,依赖于系统中安装的mysql-client.而我的系统中mysql-client版本为9.0(因为24年7月初发布了mysql9.0,当默认使用brew install mysql-client时,安装的为9.0的版本),生产环境数据为8.0因此导致连接失败。与django版本无关

处理方式:

  1. 使用brew卸载系统中的mysql-client

  2. brew install mysql-client@8.0,并根据提示写入环境变量

  3. 重启命令行,并在虚拟环境中卸载mysqlclient,并使用 pip install mysqlclient --no-cache-dir

  4. 编译时,可能遇到其他问题,请自行百度


背景与排查思路:

因为在出现这个问题时,是准备将python版本从3.9升级到3.11遇到的。升级时,将anaconda也卸载了,更换为了pyenv进行python环境的管理。

  1. 在网上搜索,发现网友遇到的问题大多是因为升级数据库到8.0后用户的认证方式的报错,报错与我的不一样。经过几个排查,排除了远程数据库的问题:

    • 数据库用的远程数据库,同事都可以连上

    • 我在本地尝试连接mysql5.7,同样报错

    • 数据库连接使用的IP,非域名

  2. 因为使用了pyenv,开始怀疑虚拟环境的问题。使用brew安装了Python@3.11.发现还是同样的报错

  3. 因为在升级时,我顺便卸载了mysqlclient,因此没法在旧的环境中验证是否可以正常连接。所以我重新安装了python3.9,进行测试,发现同样连接失败。

  4. 此时,排除了因为python版本变动导致的问题。开始怀疑是自己电脑环境的一些问题导致的。比如:在读取系统环境变量时路径问题导致的。对无用的环境变量进行了清理。同样还是连接失败。

  5. 开始找同事确认,同事使用的也时pyenv,创建了一个新的虚拟环境,pip安装了myslqclinet,在python命令行中直接连接成功。同时同事也反馈,他没有Cellar这个目录。然后在网上搜索发现是brew安装mysql的目录,因为卸载了mysql。(在7月的时候,听说mysql支持向量查询后安装的)

  6. 此时在命令行中,准备再次执行,发现报错内容改变,导入MySQLdb直接报错

    >>> import MySQLdb
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Users/qiyi/Desktop/virenv/crm-python-test-1/lib/python3.11/site-packages/MySQLdb/__init__.py", line 17, in <module>
        from . import _mysql
    ImportError: dlopen(/Users/qiyi/Desktop/virenv/crm-python-test-1/lib/python3.11/site-packages/MySQLdb/_mysql.cpython-311-darwin.so, 0x0002): Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.24.dylib
      Referenced from: <3355F89E-EC9D-3231-A50E-E42D0C5A7EC9> /Users/qiyi/Desktop/virenv/crm-python-test-1/lib/python3.11/site-packages/MySQLdb/_mysql.cpython-311-darwin.so
      Reason: tried: '/usr/local/opt/mysql/lib/libmysqlclient.24.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/opt/mysql/lib/libmysqlclient.24.dylib' (no such file), '/usr/local/opt/mysql/lib/libmysqlclient.24.dylib' (no such file)
  7. 同事也帮忙排查。两人经过半个多小时的各种尝试后,最后发现双方电脑中mysql-client的版本也不对。然后就开始卸载重装8.0版本。最后重新编译了pip包,启动django后数据库完美连接。

License:  CC BY 4.0
Share

Further Reading

OLDER

群晖gitlab容器webstation不能访问的处理

NEWER

centos切换阿里云Yum源

Recently Updated

  • 文本切分-语义分割(Semantic Chunking)
  • dify 并发配置优化
  • Typing
  • 大模型返回中json_schema与json_mode的区别
  • Async

Trending Tags

Halo 运维 postgresql 设计模式 linux就该这么学 nas rag odoo python 文本切分

Contents

©2025 刘刚刚的blog. Some rights reserved.

Using the Halo theme Chirpy