几个django 2.2和mysql使用的坑

可能是由于Django使用的MySQLdb库对Python3不支持,我们用采用了PyMySQL库来代替,导致出现各种坑,特别是执行以下2条命令的是时候:

python manage.py makemigrations
or
python manage.py inspectdb

第一个坑(提示你的mysqlclient版本过低)

无聊你是否执行pip install mysqlclient安装的最新版的,都抛出:

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None

MD,LZ看到这错误太想骂人了,没办法采取网上的方法,注释大法!

找到Python安装路劲下的Python36-32\Lib\site-packages\django\db\backends\mysql\base.py文件

将文件中的如下代码注释(可能需先关闭pycharm IDE)

if version < (1, 3, 3):
    raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

第二个坑(str类型没有decode方法)

对对对,py3默认str是unicode编码,通过encode方法编码成bytes类型,后者才有decode解码方法。
提示错误来源:Python36\lib\site-packages\django\db\backends\mysql\operations.py", line 149, in last_executed_query

  • 这里网上一搜一堆的把encode改成decode方法,我靠,这谁的脑洞无敌了

源方法内容(pip安装的django 2.2.1原封不动的内容):

    def last_executed_query(self, cursor, sql, params):
        # With MySQLdb, cursor objects have an (undocumented) "_executed"
        # attribute where the exact query sent to the database is saved.
        # See MySQLdb/cursors.py in the source distribution.
        query = getattr(cursor, ‘_executed‘, None)
        if query is not None:
            query = query.decode(errors=‘replace‘)
        return query

通过print大法输出query结果,内容为

SELECT @@SQL_AUTO_IS_NULL

数据类型为str
  • 这里网上还有注释大法,LZ不知道注释了if的后遗症是啥有没有影响,于是也没采纳。

于是我去django的github去翻这个文件这个方法的最新/历史版本,结果最新master分支内容如下:

    def last_executed_query(self, cursor, sql, params):
        # With MySQLdb, cursor objects have an (undocumented) "_executed"
        # attribute where the exact query sent to the database is saved.
        # See MySQLdb/cursors.py in the source distribution.
        # MySQLdb returns string, PyMySQL bytes.
        return force_str(getattr(cursor, ‘_executed‘, None), errors=‘replace‘)

看函数名,应该是强制去把SQL转换成str了
我靠!!!这尼玛官网2.2.1的包不是害人么,记得该文件上面引入下这个方法

from django.utils.encoding import force_str

然后再执行managa.py命令,可以了

原文地址:https://blog.51cto.com/smilepad/2412322

时间: 2024-10-22 04:48:45

几个django 2.2和mysql使用的坑的相关文章

django整合原有的mysql数据库

虽然django适合从零开始构建一个项目,但有时候整合原有的数据库也在所难免,下面以django整合我的mysql作说明. mysql数据是我从京东上抓取的数据,数据表名为jd,演示如图 下面将jd整合到django中,操作如下 1.修改settings.py [email protected]:/home/jd# vim jd/settings.py ... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #'N

python django 站点管理 配置mysql数据库

运行命令mysql -uroot -p进入mysql 新建一个数据库mydatabase 在/mysite/mysite目录下 编辑settings.py文件: 默认数据库为sqlite: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'mydatabase', } } mysql数据库配置: DATABASES = { 'default': { 'ENGINE': 'django.db.ba

python django中如何配置mysql参数

在成功安装python-mysql后,开始配置django的mysql连接配置 vi settings.py 修改 DATABASES = {    'default': {        'ENGINE': 'django.db.backends.sqlite3',        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),    }} 为 DATABASES = {    'default':{        'ENGINE':'django.d

python初探总结(pip、Django、mysqldb,mysql、sqlite3、apache, virtualenv安装配置)

安装配置: Python可应用于多平台包括 Linux 和 Mac OS X.一般的 Linux 发行版本都自带 Python,Mac OS X 最新版也自带了 Python,也就是已经安装好了,不需要再配置. linux和Mac环境下配置python: Python会安装在 /usr/lib/python** 目录中,Python库安装在/usr/local/lib/pythonXX,XX为你使用的Python的版本号. 找到记得这个位置可用于以后配置下python中的安装相应的lib库: M

Django及其配置(Mysql)

MVC和MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V):他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象和数据库的对象(ORM),视图负责与用户交互(页面),控制器(C)接收用户的输入调用模型和视图完成用户的请求. Django的MTV模式本质上与MVC模式没什么差别,也是各组件之间为了保持松耦合的关系,只是定义上有些许不同,Django的MTV分别代表: Mode(模型):负责业务对象与数据库的对象(ORM) Template

Django Sqlite3 数据库向MySQL迁移

整合了两个URL而来.. 1,http://www.phodal.com/blog/django-mezzanine-sqlite3-migrate-mysql/ 2,http://www.ziqiangxuetang.com/django/django-data-migration.html A.先建立一个SLAVE数据库 DATABASES = { "default": { "ENGINE": "django.db.backends.sqlite3&q

django中怎么使用mysql数据库的事务

Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败. Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交.我们需要在保存数据库操作中自己控制数据库事务的执行流程. 在Django中可以通过django.db.transaction模块提供的atomic来定义一个事务,atomic提供两种用法: 装饰器用法 from django.db import transaction

django连接多个mysql数据库

https://www.cnblogs.com/zhangxinqi/p/9094953.html 阅读目录 1.定义数据库 (1) DATABASES内部选项: (2)自定义数据库 2.同步数据库 3.自动数据库路由 (1)定义数据库路由方法类 (2)使用路由数据库 (3)生成数据表并同步数据 4.手动选择数据库 回到顶部 1.定义数据库 在django项目中, 一个工程中存在多个APP应用很常见:有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接.在Django的sett

django 2.2和mysql使用的常见问题

可能是由于Django使用的MySQLdb库对Python3不支持,我们用采用了PyMySQL库来代替,导致出现各种坑,特别是执行以下2条命令的是时候: python manage.py makemigrations or python manage.py inspectdb 报错1:(提示你的mysqlclient版本过低),无论你是否执行pip install mysqlclient安装的最新版的,都抛出: django.core.exceptions.ImproperlyConfigure