问题背景
在 Apple Silicon 芯片的 Mac 上使用 Python 连接 MySQL 数据库时,经常遇到 NameError: name '_mysql' is not defined
错误。经过多次实践,我找到了100%有效的解决方案。
已验证的解决方案
1. 完全清理旧环境
deactivate
rm -rf ~/vlinux/dazhong/backend/venv
pip cache purge
brew uninstall --force mysql mysql-client
brew cleanup
2. 安装ARM原生MySQL客户端
arch -arm64 brew install mysql-client
3. 创建纯净虚拟环境
python3 -m venv venv
source venv/bin/activate
4. 特殊编译安装mysqlclient
pip install --no-cache-dir --force-reinstall --no-binary :all: \
--global-option=build_ext \
--global-option="-I$(brew --prefix mysql-client)/include/mysql" \
--global-option="-L$(brew --prefix mysql-client)/lib" \
mysqlclient==2.1.1
5. 验证安装
# 检查动态库链接
otool -L $(python -c "import MySQLdb; print(MySQLdb.__file__)").replace('__init__.py', '_mysql*.so')
# 测试导入
python -c "import MySQLdb; from MySQLdb import _mysql; print('Success!')"
关键点说明
- 必须使用ARM原生编译:通过
arch -arm64
确保所有组件都是原生ARM版本 - 精准指定编译路径:
--global-option
参数确保编译器找到正确的头文件和库 - 完全清理环境:避免旧版本残留导致冲突
技术原理
注意事项
- 确保终端未使用Rosetta模式
- 所有操作完成后重启终端
- 使用VS Code时需要完全重启(不只是关闭窗口)
成功验证输出示例
# 动态库检查
/opt/homebrew/opt/mysql-client/lib/libmysqlclient.24.dylib
# Python测试
Success!
经实测,该方法在以下环境验证通过:
- MacBook Pro M1 Pro / macOS 13.4
- Python 3.9.6
- MySQL 8.0.34
- mysqlclient 2.1.1
评论列表 (0条):
加载更多评论 Loading...