连接Heroku ClearDB MySQL数据库时出现位置参数错误
解决Django迁移时
DatabaseWrapper.display_name() takes 0 positional arguments but 1 was given错误 问题根源
你遇到的错误本质是**mysql-connector-python 8.0.30及以后版本的兼容性bug**——虽然你配置的是mysql.connector.django,但这个后端实际上是mysql-connector-python包的一部分,所以Reddit的建议其实是关联的,只是你没意识到两者的从属关系。另外,你的requirements里同时安装了mysqlclient、PyMySQL、mysql-connector-python三个MySQL驱动,这会导致Django加载驱动时出现冲突,加重问题。
修复步骤
降级
mysql-connector-python到兼容版本
修改你的requirements.txt,把mysql-connector-python==8.0.33替换为:mysql-connector-python==8.0.298.0.30+版本修改了
display_name()方法的定义,去掉了必要的self参数,导致Django调用时传参不匹配。清理冗余的MySQL驱动
从requirements.txt中删除以下无用/冲突的包:mysql==0.0.3(无实际作用的空包)mysqlclient==2.1.1PyMySQL==1.0.3
同时保留多个MySQL驱动会让Django无法确定使用哪个后端,引发不可预知的错误。
重新部署并测试
- 本地验证:创建虚拟环境,安装修改后的依赖,运行
python manage.py migrate确认错误消失。 - 提交修改到Git仓库,重新push到Heroku。
- 在Heroku上执行迁移:
heroku run python manage.py migrate
- 本地验证:创建虚拟环境,安装修改后的依赖,运行
备选方案
如果降级后仍有问题,可以切换到更稳定的mysqlclient驱动:
- 修改
settings.py中的数据库引擎:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASS'), 'HOST': os.environ.get('DB_HOST'), 'PORT': '3306', } } - 确保
requirements.txt中只保留mysqlclient==2.1.1,删除其他MySQL驱动包。
内容的提问来源于stack exchange,提问作者Ian McInnes
相关产品推荐
相关产品推荐

