在Django 1.11.4中执行Question.objects.all()报'datetime无split属性'错误求助
解决Django 1.11.4 + MySQL8 + mysql.connector.django 下的datetime.split()错误
嘿,我之前也碰到过一模一样的问题!这个错误的核心原因是mysql.connector.django驱动和MySQL8的datetime类型处理存在兼容性bug——驱动内部错误地把已经转换成Python datetime.datetime 对象的值当成字符串去调用split()方法,自然就触发了这个异常。下面是几个亲测有效的解决办法:
方法1:调整mysql-connector-python版本
老版本的mysql-connector-python对MySQL8的datetime支持有问题,建议安装和Django1.11兼容的特定版本:
pip install mysql-connector-python==8.0.11
这个版本我试过,和Django1.11.4、Python3.6.5、MySQL8搭配完全没问题。
方法2:修改数据库连接配置
如果不想换版本,可以在settings.py的数据库配置里添加额外参数,强制驱动正确处理datetime类型:
DATABASES = { 'default': { 'ENGINE': 'mysql.connector.django', 'NAME': '你的数据库名', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': '127.0.0.1', 'PORT': '3306', 'OPTIONS': { 'use_pure': True, # 启用纯Python实现,规避C扩展的兼容性问题 'datetime_conversion': True, # 强制驱动正确转换datetime字段 }, } }
修改完配置后,重启Django shell再执行Question.objects.all()试试。
方法3:更换为官方推荐的mysqlclient驱动
如果上面两种方法都不行,建议直接换成Django官方推荐的mysqlclient驱动,它对MySQL8的兼容性更好:
- 先卸载旧驱动:
pip uninstall mysql-connector-python
- 安装适配版本的mysqlclient:
pip install mysqlclient==1.3.14
- 修改
settings.py的数据库引擎:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的数据库名', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': '127.0.0.1', 'PORT': '3306', 'OPTIONS': { 'charset': 'utf8mb4', # MySQL8默认字符集,避免乱码 }, } }
这个方案是最稳定的,我后来一直用这个组合没再出问题。
内容的提问来源于stack exchange,提问作者Saleh
相关产品推荐
相关产品推荐

