如何解决Django切换MySQL时的NameError: name '_mysql' is not defined错误
解决Django切换MySQL时mysqlclient导入错误问题
问题场景
启动Django项目后,原使用SQLite3创建模型和迁移文件,现切换至MySQL+Workbench开发。完成MySQL、mysqlclient、Workbench安装,并在settings.py配置数据库信息后,执行python manage.py migrate或python manage.py runserver触发错误。
数据库配置(settings.py)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'storedb', 'USER': 'root', 'PASSWORD': '2E71Blue.8', 'PORT': 3306, 'HOST': '127.0.0.1', } }
错误回溯信息
Watching for file changes with StatReloader Exception in thread django-main-thread: Traceback (most recent call last): File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/MySQLdb/__init__.py", line 18, in <module> from . import _mysql ImportError: dlopen(/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/MySQLdb/_mysql.cpython-310-darwin.so, 2): Symbol not found: _mysql_affected_rows Referenced from: /Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/MySQLdb/_mysql.cpython-310-darwin.so Expected in: flat namespace in /Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/MySQLdb/_mysql.cpython-310-darwin.so During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 1016, in _bootstrap_inner self.run() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 953, in run self._target(*self._args, **self._kwargs) File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/utils/autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/core/management/commands/runserver.py", line 125, in inner_run autoreload.raise_last_exception() File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/utils/autoreload.py", line 87, in raise_last_exception raise _exception[1] File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/core/management/__init__.py", line 394, in execute autoreload.check_errors(django.setup)() File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/utils/autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/apps/registry.py", line 116, in populate app_config.import_models() File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/apps/config.py", line 269, in import_models self.models_module = import_module(models_module_name) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/contrib/auth/models.py", line 3, in <module> from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/contrib/auth/base_user.py", line 57, in <module> class AbstractBaseUser(models.Model): File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/db/models/base.py", line 143, in __new__ new_class.add_to_class("_meta", Options(meta, app_label)) File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/db/models/base.py", line 371, in add_to_class value.contribute_to_class(cls, name) File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/db/models/options.py", line 243, in contribute_to_class self.db_table, connection.ops.max_name_length() File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/utils/connection.py", line 15, in __getattr__ return getattr(self._connections[self._alias], item) File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/utils/connection.py", line 62, in __getitem__ conn = self.create_connection(alias) File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/db/utils.py", line 193, in create_connection backend = load_backend(db["ENGINE"]) File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/db/utils.py", line 113, in load_backend return import_module("%s.base" % backend_name) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/django/db/backends/mysql/base.py", line 15, in <module> import MySQLdb as Database File "/Users/cecibenitez/.local/share/virtualenvs/storebackend-1ILPqCOa/lib/python3.10/site-packages/MySQLdb/__init__.py", line 24, in <module> version_info, _mysql.version_info, _mysql.__file__ NameError: name '_mysql' is not defined
已尝试方法
- 安装mysqlclient依赖的C包
- 配置
.zprofile中的MySQL路径 - 升级MySQL至8.0.33版本
当前环境信息
- Python版本:
3.10.5 - MySQL版本:
Ver 8.0.33 for macos11.7 on x86_64 (Homebrew)
Pipfile内容
[[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] django = "*" django-debug-toolbar = "*" mysqlclient = "*" pymysql = "*" [dev-packages] [requires] python_version = "3.10"
解决方案
方案1:用pymysql替代mysqlclient
已安装pymysql,直接让Django适配:
- 在项目根目录的
__init__.py中添加代码:
import pymysql pymysql.install_as_MySQLdb()
- 重新执行
python manage.py migrate或runserver
方案2:重新编译mysqlclient适配本地MySQL
确保mysqlclient基于当前MySQL环境编译:
- 卸载现有mysqlclient:
pip uninstall mysqlclient -y
- 指定Homebrew安装的MySQL路径,重新编译安装:
export PATH="/usr/local/mysql/bin:$PATH" export LDFLAGS="-L/usr/local/mysql/lib" export CPPFLAGS="-I/usr/local/mysql/include" pip install mysqlclient --no-binary mysqlclient
- 激活虚拟环境后重新运行命令
方案3:检查架构兼容性
macOS下Python与MySQL架构不匹配(如x86_64 vs arm64)会导致符号缺失:
- 检查Python架构:
python -c "import platform; print(platform.architecture())" - 检查MySQL架构:
mysql -V(查看输出中的x86_64或arm64)
若不一致,重新安装对应架构的Python或MySQL
内容的提问来源于stack exchange,提问作者CeciResponde
相关产品推荐
相关产品推荐

