1,guest/settings.py中加上

import pymysql
pymysql.install_as_MySQLdb()

 安装好pymysql

2,guest/settings.py的DATABASES设置参数如下,

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST' : '数据库ip',
'PORT' : '数据库端口',
'NAME': '数据库名称',
'USER' : 'msql用户名',
'PASSWORD' : 'mysql密码',
'OPTIONS' : {
'init_command' : "SET sql_mode='STRICT_TRANS_TABLES'",
}, }
}

3,出现问题清单

ImproperlyConfigured: mysqlclient 1.3.13 or newer is required
1、问题背景:
已经安装好了 pymysql,但是在命令行执行 python3 manage.py migrate 进行数据迁移时报如下错误:
(当然,你也可能是在执行其它操作时遇到类似错误)

......

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 36, in <module>
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

根据最后两行的提示,mysqlclient 版本不够新,但是我已经都安装的最新版本了呀。

2、问题原因
虽然本地已安装了 PyMySQL 驱动,但 Django 连接 MySQL 时仍默认使用 MySQLdb 驱动,但 MySQLdb 并不支持 Python3,所以需要手动在项目中进行配置。

在项目根目录下的 __init__.py 文件中添加如下代码即可:

import pymysql
pymysql.install_as_MySQLdb()
1
2
再次执行命令时,还是会报错,没关系,仔细看下报错的倒数第三行,已经告诉你是在 base.py 第 36 行报的错,根据你的提示路径打开 base.py,把 35、36 行前面加 # 注释掉就好了,就像下面这样:

34 version = Database.version_info
35 #if version < (1, 3, 13):
36 # raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

现在再次执行命令,上面的报错已经没有了,但是又有了新的错误,看下面怎么解决吧。

AttributeError: 'str' object has no attribute 'decode'
解决了上面的问题后,又遇到下面这个错误:

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/db/backends/mysql/operations.py", line 146, in last_executed_query
query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'

提示属性错误:“str”对象没有属性“decode”。

问题的原因是,在 Python3 里:

str 通过 encode() 转换成 bytes
bytes 通过 decode() 转换成 str
也就是说:str 只有 encode() 方法,bytes 只有 decode() 方法!
这个估计是 django 的 bug 了。

解决方法:根据提示打开报错的文件 operations.py

找到 146 行,把 decode 改成 encode 即可,类似下面这样:
140 def last_executed_query(self, cursor, sql, params):
141 # With MySQLdb, cursor objects have an (undocumented) "_executed"
142 # attribute where the exact query sent to the database is saved.
143 # See MySQLdb/cursors.py in the source distribution.
144 query = getattr(cursor, '_executed', None)
145 if query is not None:
146 query = query.encode(errors='replace') # 这里把 decode 改为 encode
147 return query

此时,再次执行命令就不报错了,大功告成!

  

最新文章

  1. [收藏]IntelliJ Idea快捷键
  2. Android中使用Notification实现宽视图通知栏(Notification示例二)
  3. Matlab中的mapminmax函数学习
  4. [php-src]Php扩展的多文件编译
  5. 解决MYSQL错误:ERROR 1040 (08004): Too many connections
  6. Python中什么是set、更新、遍历set和set的特点
  7. App上架出现问题-ERROR ITMS-90034
  8. SQL查看数据库所用用户表数量和使用的空间
  9. HTML5摇一摇
  10. 你好,C++(29)脚踏两只船的函数不是好函数 5.4 函数设计的基本规则
  11. C语言--位运算符
  12. Monkey 命令使用说明
  13. 前端知识复习一(css)
  14. 第三节:Creating API Endpoints (创建API路由)
  15. 微信网页悬浮窗交互效果的web实现
  16. [LeetCode] Most Common Word 最常见的单词
  17. struts2的基本使用
  18. Lock锁与Condition监视器(生产者与消费者)。
  19. 万恶之源 - Python包的应用
  20. Spring Security 与 OAuth2 介绍

热门文章

  1. myeclipse 工具栏 Run按钮不见了,怎么调出来啊?
  2. vue中的各种属性
  3. python连接mysql操作(1)
  4. vue 项目, 通知子组件更新,父组件中每次点击按钮重新加载子组件,(重新生成dom 元素)
  5. js 引号 转义字符 json字符串
  6. codevs 1077 多源最短路x
  7. Jmeter(三) 从上传图片来入门Jmeter
  8. SQLMAP自注入--INJECTION TECGBUQUES FINGERPRINT
  9. java通讯录获取汉字首字母
  10. jsvnadmin访问一直登陆 找不到用户