在cPanel执行python manage.py migrate时报错:'staticmethod'不可调用
解决Django生产环境migrate报错TypeError: 'staticmethod' object is not callable
问题定位
从报错堆栈和环境信息来看,错误直接源于mysql.connector.django引擎与当前Django版本不兼容:当Django尝试获取数据库连接的display_name属性时,该属性被定义为静态方法(staticmethod),但Django逻辑期望它是可调用的实例方法,因此触发类型错误。
你的场景完全匹配该问题的典型特征:
- DEBUG模式下用SQLite执行migrate正常
- makemigrations/collectstatic可正常运行(这两个命令不会触发数据库连接的约束检查逻辑)
- 生产环境切换到MySQL+
mysql.connector.django引擎后出现报错
解决方案
方案1:更换为Django官方推荐的MySQL引擎(优先选择)
mysql.connector.django并非Django官方维护的引擎,兼容性远不如官方推荐的django.db.backends.mysql。操作步骤:
- 安装依赖包:
pip install mysqlclient
- 修改
base.py中的数据库配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': env('PRODUCTION_DATABASE_NAME'), 'USER': env('PRODUCTION_DATABASE_USERNAME'), 'PASSWORD': env('PRODUCTION_DATABASE_PASSWORD'), 'HOST': env('PRODUCTION_DATABASE_HOST'), # 可选:添加字符集配置避免编码问题 'OPTIONS': { 'charset': 'utf8mb4', }, } }
- 重新执行migrate:
python manage.py migrate
方案2:降级mysql-connector-python到兼容版本
如果必须使用mysql.connector.django,可尝试降级到与当前Django版本兼容的旧版本(比如8.0.28版本,该版本修复了display_name的静态方法问题):
- 卸载当前版本:
pip uninstall mysql-connector-python
- 安装指定版本:
pip install mysql-connector-python==8.0.28
- 重新执行migrate命令
方案3:临时绕过(不推荐,仅应急使用)
修改Django源码中django/utils/functional.py第57行附近的调用逻辑,强制处理静态方法的调用问题,但这种方法会影响后续版本升级,仅建议紧急情况下临时使用。
额外排查点
- 确认生产环境MySQL服务正常运行,数据库账户具备足够权限(可通过
mysql -u 用户名 -p命令测试连接) - 检查环境变量是否正确加载(
PRODUCTION_DATABASE_NAME等变量是否被正确读取)
内容的提问来源于stack exchange,提问作者squidg
相关产品推荐
相关产品推荐

