一次mac环境下,dango4.2报错的问题
在升级至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版本无关
处理方式:
使用brew卸载系统中的mysql-client
brew install mysql-client@8.0,并根据提示写入环境变量
重启命令行,并在虚拟环境中卸载mysqlclient,并使用 pip install mysqlclient --no-cache-dir
编译时,可能遇到其他问题,请自行百度
背景与排查思路:
因为在出现这个问题时,是准备将python版本从3.9升级到3.11遇到的。升级时,将anaconda也卸载了,更换为了pyenv进行python环境的管理。
在网上搜索,发现网友遇到的问题大多是因为升级数据库到8.0后用户的认证方式的报错,报错与我的不一样。经过几个排查,排除了远程数据库的问题:
数据库用的远程数据库,同事都可以连上
我在本地尝试连接mysql5.7,同样报错
数据库连接使用的IP,非域名
因为使用了pyenv,开始怀疑虚拟环境的问题。使用brew安装了Python@3.11.发现还是同样的报错
因为在升级时,我顺便卸载了mysqlclient,因此没法在旧的环境中验证是否可以正常连接。所以我重新安装了python3.9,进行测试,发现同样连接失败。
此时,排除了因为python版本变动导致的问题。开始怀疑是自己电脑环境的一些问题导致的。比如:在读取系统环境变量时路径问题导致的。对无用的环境变量进行了清理。同样还是连接失败。
开始找同事确认,同事使用的也时pyenv,创建了一个新的虚拟环境,pip安装了myslqclinet,在python命令行中直接连接成功。同时同事也反馈,他没有
Cellar
这个目录。然后在网上搜索发现是brew安装mysql的目录,因为卸载了mysql。(在7月的时候,听说mysql支持向量查询后安装的)此时在命令行中,准备再次执行,发现报错内容改变,导入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)
同事也帮忙排查。两人经过半个多小时的各种尝试后,最后发现双方电脑中mysql-client的版本也不对。然后就开始卸载重装8.0版本。最后重新编译了pip包,启动django后数据库完美连接。