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

摘要:
前置条件django版本:2.2.1python版本:3.6.6mysql版本:mysql-community8.0.15问题在搭建django项目,配置mysql数据库时遇到无法迁移数据库的问题,错误信息如下图:问题分析过程由错误信息,可大致看出是一个叫mysqlclient的包版本不匹配导致的问题。django2.2默认使用“mysqlclient”这个库去连接mysql,而网上很多教程中使用的是“pymysql”。修改django全局配置文件settings.py,取消导入pymysql库,注释代码pymysql.install_as_MySQLdb(),再次迁移数据库,成功。

前置条件

django版本:2.2.1

python版本:3.6.6

mysql版本:mysql-community8.0.15

问题

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

Django2.2使用mysql数据库pymysql版本不匹配问题的解决过程与总结第1张

问题分析过程

由错误信息,可大致看出是一个叫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指令安装直接报错,错误信息如图:

Django2.2使用mysql数据库pymysql版本不匹配问题的解决过程与总结第2张

继续搜索,查到是因为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版本不匹配问题的解决过程与总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS常用宏定义Android智能指针sp wp详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Microsoft SQL Server 查询连接数和关闭连接数

1.查询指定数据库有哪些连接(connection) SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT [DBID] FROM [Master].[dbo].[SYSDATABASES] WHERE NAME='test'...

用Python做股市数据分析(一)

本文由伯乐在线-小米云豆粥翻译。未经许可,禁止转载!英文出处:Curtis Miller。欢迎加入翻译组。 这篇博文是用Python分析股市数据系列两部中的第一部,内容基于我犹他大学 数学3900 (数据科学)的课程。在这些博文中,我会讨论一些基础知识。比如如何用pandas从雅虎财经获得数据, 可视化股市数据,平局数指标的定义,设计移动平均交汇点分析移动...

linux mysql 查看默认端口号和修改端口号

如何查看mysql默认端口号和修改端口号2015-03-1917:42:18 1.登录mysql [root@test/]#mysql-uroot-p Enterpassword: 2.使用命令showglobalvariableslike'port';查看端口号 mysql>showglobalvariableslike'port'...

python 将文本txt 转换 excel(xls)

现在有很多工具可以将mysql数据库中数据直接dump为excel表格模式,例如,navicat,sqlyog等,但是个人认为最好用是navicat,但是navicat需要收费。 通过select into outfile 可将数据导出为.txt格式,然后再通过python脚本将.txt格式转换成xls格式。 MySQL导出文本语句: SELECT * F...

python编码encode decode(解惑)

关于python 字符串编码一直没有搞清楚,今天总结了一下。 Python 字符串类型 Python有两种字符串类型:str 与 unicode。 字符串实例 # -*- coding: utf-8 -*- # 这个是 str 的字符串 s = '关关雎鸠' # 这个是 unicode 的字符串 u = u'关关雎鸠' print isinstanc...

Mysql 10053 SocketException 你的主机中的软件中止了一个已建立的连接。

问题:存数据库失败 错误信息: Mysql 1053 SocketException 你的主机中的软件中止了一个已建立的连接。 解决方法:修改数据库最大数据传输量【max_allowed_packet】 1:查询【max_allowed_packet】:show variables like '%max_allowed_packet%';   结果只有10...