一、问题描述:
django中默认的数据是sqlite,但是我们正常使用都是mysql,所以就按照官网的教程配置修改settings.py中的数据库配置,项目初始化文件__init__.py, 如下:
1、settings.py
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
# 修改成mysql如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test', # 你的数据库名称
'USER': 'root', # 你的数据库用户名
'PASSWORD': '123456', # 你的数据库密码
'HOST': '', # 你的数据库主机,留空默认为localhost
'PORT': '3306', # 你的数据库端口
}}
2、__init__.py
# 由于mysql默认引擎为MySQLdb,在__init__.py文件中添加下面代码
# 在python3中须替换为pymysql,可在主配置文件(和项目同名的文件下,不是app配置文件)中增加如下代码
import pymysql
pymysql.install_as_MySQLdb()
# 如果找不到pymysql板块,则通过pip install pymysql进行安装。
3、按照教程说,完成上面两步后,重新运行如下命令更新初始化数据库就可以了。
python manage.py makemigrations
python manage.py migrate
4、然而,按照如下配置后,运行报错如下:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
# 等你安装pip install pymysql后,继续报错如下:
mysqlclient 1.3.3 or newer is required 。。。。
二、问题定位
1、检查了安装的django版本为3.0.6, pymysql的版本为 0.9.3
2、经过查找资料定位,发现报错的原因是django版本太高,pymysql0.9.3不支持。
三、问题解决方法
1、django降级到能支持的版本,2.1.4版本就OK了
pip install --upgrade django==2.1.4
更新版本成功后运行django刷新数据库的命令,再次启动项目,发现已经正常。
2、不去降级django版本,继续使用django3,这样的话,解决起来就相对麻烦很多了(需要修改源码)。
#找到Python环境下 django包,并进入到backends下的mysql文件夹
cd /opt/anaconda3/envs/envAGC_Mini/lib/python3.6/site-packages/django/db/backends/mysql
#文件列表如下
# 找到base.py文件,注释掉 base.py 中如下部分(35/36行)
if version < (1, 3, 3):
raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
此时仍会会报错,报错信息如下:
AttributeError: ‘str’ object has no attribute ‘decode’
#找到operations.py文件(46行,版本不同行数不同哈~自个儿find一下),将decode改为encode
#linux vim 查找快捷键:?decode
if query is not None:
query = query.decode(errors='replace')
return query
#改为
if query is not None:
query = query.encode(errors='replace')
return query
修改完成后,重新刷新数据库,再次启动项目,应该正常。
以上为查询网上资料后总结的方法,只作为个人参考~