django设置mysql为数据库笔记
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
此时,再次执行命令就不报错了,大功告成!
django设置mysql为数据库笔记的更多相关文章
- Django链接MySQL,数据库迁移
form表单默认是以get请求提交数据的 http://127.0.0.1:8000/login/?username=admin&password=123 action 1 不写,默认向当前地 ...
- 在django中用MySQL为数据库 新建一个项目的流程
创建mysql数据库 在cmd输入 mysql -uroot -p 启动mysql客户端并连接服务器 创建一个db_orm的数据库 mysql>CREATE DATABASE db_orm ch ...
- Django+Ajax+Mysql实现数据库数据的展示
最近老师让搞一个系统,仅仅展示一下数据库的数据 在做海底捞时,是交接的师兄的项目,用的语言是java,框架是SSM(Spring.SpringMVC.MyBatis),这次我准备用Python写,前端 ...
- docker-compose设置mysql初始化数据库的字符集
version: '3' services: mysql: image: mysql:5.7.24# volumes:# - ./mysqld.cnf:/etc/mysql/mysql.conf.d/ ...
- django中mysql数据库设置错误解决方法
刚在django中settings.py进行设置mysql数据库. 当进行执行python manage.py shell命令时会报以下错误: 只需要在settings.py中 DATABASES = ...
- Django 连接 MySQL 数据库及常见报错解决
目录 Django 连接 MySQL数据库及常见报错解决 终端或者数据库管理工具连接 MySQL ,并新建项目所需数据库 安装访问 MySQL 的 Python 模块 Django 相关配置 可能会遇 ...
- Django连接mysql数据库
1.app中对应的models.py配置相关表结构信息 from django.db import models class Question(models.Model): question_text ...
- Django 连接mysql数据库中文乱码
Django 连接mysql数据库中文乱码 2018年08月25日 20:55:15 可乐乐乐乐乐 阅读数:566 版本:CentOS6.8 python3.6.4 django1.8.2 数据库 ...
- Django中把SQLite数据库转换为Mysql数据库的配置方法
我们在学习和开发Django的时候,一般是使用SQLite作为数据库.在正式讲网站部署上线是用MySQL数据库比较多.MySQL支持高并发的访问,而且相对于SQLite,MySQL性能更好.下面讲讲如 ...
随机推荐
- poi导出excel数据量过大
问题:使用poi导出excel,数据量过大导致内存溢出 解决思路:1.多sheet导出 2.生成多个excel打包下载 3.生成csv下载 本文使用的是第二个思路,代码如下: poiUtil工具类 p ...
- 链接数据库模板 DataBaseLinkTool
一. 1.Dao层 对数据库的底层操作 增删改查 package Dao; import java.sql.Connection; import java.sql.ResultSet; import ...
- js 选中文字
选中文字,文字背景是蓝色 当前点击的元素: var e = e || event; var tag = e.target || e.srcElement; 选中文字:window.getSelecti ...
- 对数据劫持 OR 数据代理 的研究------------引用
数据劫持,也叫数据代理. 所谓数据劫持,指的是在访问或者修改对象的某个属性时,通过一段代码拦截这个行为,进行额外的操作或者修改返回结果.比较典型的是 Object.defineProperty() 和 ...
- zTree 节点展开
var treeObj = $("#treeDemo"); $.fn.zTree.init(treeObj, setting, Znode1); zTree_Menu = $.fn ...
- JavaScript 运算符是什么?
㈠JavaScript 运算符 ⑴运算符 = 用于赋值. ⑵运算符 + 用于加值. ⑶示例: 向变量赋值,并把它们相加: ; // 向 x 赋值 5 ; // 向 y 赋值 2 var z = ...
- JS实现深拷贝的几种方法
引 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力. 此篇文章中也会简单阐述到栈 ...
- HEOI2016/TJOI2016 字符串问题
题目链接:戳我 非常不好意思,因为想要排版,所以今天先只把代码贴出来,明天补题解. 40pts暴力:直接暴力匹配 #include<iostream> #include<cstrin ...
- django + jquery 实现二级联动
二级联动用ajax还是很好实现的,下面简单给个例子 jquery代码 $("#id_sel").change(function(){ $.get("/browser/ge ...
- JAVA使用easyexcel操作Excel
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本 ...