一、問題描述:
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
修改完成後,重新刷新數據庫,再次啓動項目,應該正常。
以上爲查詢網上資料後總結的方法,只作爲個人參考~