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