前置条件

django版本:2.2.1

python版本:3.6.6

mysql版本:mysql-community8.0.15

问题

在搭建django项目,配置mysql数据库时遇到无法迁移数据库的问题,错误信息如下图:

问题分析过程

由错误信息,可大致看出是一个叫mysqlclient的包版本不匹配导致的问题。

搜索引擎检索相关错误,得知:python访问mysql需要安装对应的驱动包,即将mysql的API接口转换成python格式供数据库应用软件开发者直接调用的第三方库。django2.2默认使用“mysqlclient”这个库去连接mysql,而网上很多教程中使用的是“pymysql”。这两个库有什么区别呢?继续搜索。

pymysql、mysqlclient与mysqldb

pypi中关于pymsql的说明:最新版本0.9.3,用纯python语言开发的mysql驱动库,大部分API与mysqlclient和MySQLdb兼容,python2只支持2.7版本,python3版本支持3.4及以上版本,mysql版本要求5.5版本及以上。

pypi中关于mysqlclient的说明:最新版本1.4.2,是MySQLdb1的分支,支持python3。

pypi中关于mysqldb的说明:包名称为MySQL-python,mysql数据库的接口库,支持mysql数据库3.23-5.5版本,支持python2.4-2.7版本,线程安全。

此时,错误信息中的两个版本号就可以解释了,因为我按网上教程,在django配置文件settings.py中使用了pymsql来连接mysql数据库,这是报错的原因。为什么错误信息中提示我的myclient版本是0.9.3?猜想(没有验证)是因为“pymysql.install_as_MySQLdb()”这行代码,因为django而默认使用mysqldb(或myclient,一个东西,可看成python2和python3的对应版本),而pymysql是一个很方便的支持python3的mysql数据库驱动库,所以把它以mysqldb的名字安装,此时django把pymsql的版本号当成myclient的版本号输出。

到这里,问题解决的思路就比较明确了,两种方式:一种是修改django的源码,让版本号通过校验;另一种是安装合适的myclient版本。

在选择解决方案之前,心中有个疑惑还没有解决:pymysql和myclient都提供mysql数据库的python版API,用哪个好?继续搜索引擎大法。

一通对比搜索后,找到下面三篇看上去比较严谨可信的文章:

https://blog.csdn.net/u011510825/article/details/86632598

https://my.oschina.net/sukai/blog/1930092

https://blog.csdn.net/sigmarising/article/details/83473039

总结起来就是:mysqldb(mysqlclient)C语言开发,速度相比pymysql优势明显;pymysql由于纯python开发,与python无缝对接,使用、安装方便,反而用的人更多;mysqlclient对mysql8的默认用户加密方式 caching_sha2_password不支持(未验证)

经过一翻对比,决定使用mysqlclient,一是考虑其性能更好,二是不想随意修改django源码。

mysqlclient安装

果不其然,mysqlclient的安装并不顺利,使用pip指令安装直接报错,错误信息如图:

继续搜索,查到是因为mysql-devel没安装,顺便检索到mysql-devel的作用:header files, debug symbols. Required when building source packages that requires them,里面包含了C语言的一些头文件,想要编译安装mysql的其它客户端程序时,需要用到这个库。

centos系统下输入rpm查找指令:rpm -qa|grep mysql查看mysql安装信息,发现确实没有安装mysql-devel,于是下载与已安装的mysql服务相同版本号(不同版本可能又会引出其它问题)的mysql-devel库的rpm包,安装成功后再次使用pip命令安装myclient库,成功。

修改django全局配置文件settings.py,取消导入pymysql库,注释代码pymysql.install_as_MySQLdb(),再次迁移数据库,成功。

总结

以上是在学习django过程中遇到的一个小问题,从一个小问题一层层深入、分析问题的原因,从问题中引出新的问题,层层递进,可以由一点串成一条线甚至到一张网(如果时间允许的话)。问题本身意义不大,但自觉在解决这个问题的过程中层层递进,由点到线的学习思想很有总结意义,特记录于此,也可供更多人学习、参考。

Django2.2使用mysql数据库pymysql版本不匹配问题的解决过程与总结的更多相关文章

  1. 三种方法查看MySQL数据库的版本

    1.使用-V参数 首先我们想到的肯定就是查看版本号的参数命令,参数为-V(大写字母)或者--version 使用方法: D:\xampp\mysql\bin>mysql -V 或者 D:\xam ...

  2. 第二百七十九节,MySQL数据库-pymysql模块操作数据库

    MySQL数据库-pymysql模块操作数据库 pymysql模块是python操作数据库的一个模块 connect()创建数据库链接,参数是连接数据库需要的连接参数使用方式: 模块名称.connec ...

  3. MySQL数据库各个版本的区别

    MySQL数据库各个版本的区别 MySQL数据库 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管 ...

  4. django2.0+连接mysql数据库迁移时候报错

    django2.0+连接mysql数据库迁移时候报错 情况一 错误信息 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 ...

  5. 如何查看MySQL数据库的版本

    如何查看MySQL数据库的版本 一.总结 一句话总结: SQL语句:select version(); 命令行:mysql -V 或 mysql --version 二.三种方法查看MySQL数据库的 ...

  6. mysql数据库查找类型不匹配

    无意中看到10级学长的博客,提到了mysql数据库类型查找不匹配的问题,博客地址是:卢俊达 . 数据库中建表中会对每个属性进行类型划分,然后在查找数据库select时: MySQL 的文档 (Type ...

  7. Django2.2连接mysql数据库出现django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None问题

    在使用Django2.2开发的时候,想要使用mysql数据库,在settings.py文件中更改命令: DATABASES = { 'default': { 'ENGINE': 'django.db. ...

  8. [技术博客]django连接mysql数据库的方法及部分问题的解决方法

    配置机器介绍 操作系统:Ubuntu 18.04.2 LTS 64位 python版本:Python 3.6.7 Django版本:Django 2.2 MySql版本:5.7.26 数据库选择 我们 ...

  9. Go连接MySql数据库Error 1040: Too many connections错误解决

    原文:https://my.oschina.net/waknow/blog/205654 摘要: 使用Go链接数据库时,由于连接释放不当会在一段时间以后产生too many connections的错 ...

随机推荐

  1. jdk代理

    接口: public interface IUserService { public void saveUser(String username,String password); public vo ...

  2. javascript中call()、apply()、bind()的用法理解

    一.bind的用法 第一个:obj.showInfo('arg','arg_18');中传的2个参数通过showInfo方法改变的是obj下中的name和age 第二个:obj.showInfo.bi ...

  3. pscp no such file or directory

    背景:在WINDOWS10 上传一个文件 到 Centos 7中 工具:pscp 用法: pscp.exe -C e:\tinyfox\site\wwwroot\cdms\projecttemplat ...

  4. axios使用配置

    axios 配置 下载cnpm install axios vue-axios --save-dev main.js文件中配置 import axios from 'axios' import Vue ...

  5. AI software can catch shoplifters before they steal

    日本研发出智能软件 不等下手就能识别小偷 AI software can catch shoplifters before they steal 在汤姆·克鲁斯主演的电影<少数派报告>中, ...

  6. java 千分位的添加和去除

    转至:http://blog.sina.com.cn/s/blog_8f99a1640102v1xh.html 将一个数字转换为有千分位的格式: NumberFormat numberFormat1  ...

  7. 利用jsplumb和碰撞检测自动生成流程图

    使用jsplumb构建流程图模型时,有一个需求要求,选项可以从选项表中拖拽到指定容器,并且两个选项要接触到的时候才能连接起来,不接触不能连接.效果图如下 略丑- 因为这里用到了拖拽,拖放功能,所以用到 ...

  8. IOS 响应者链条 and UIGestureRecognizer 手势识别器)

    一次完整的触摸事件的传递响应的过程 UIAppliction --> UIWiondw -->递归找到最适合处理事件的控件 控件调用touches方法-->判断是否实现touches ...

  9. kubernetes-服务发现service(九)

    service •防止Pod失联    •定义一组Pod的访问策略    •支持ClusterIP,NodePort以及LoadBalancer三种类型    •Service的底层实现主要有ipta ...

  10. AOSP常见漏洞类型简介

    Heap/Stack Overflow(CVE-2017-0541) 漏洞出现在PushcdlStack函数中,如下所示   # /external/sonivox/arm-wt-22k/lib_sr ...