前置条件python
django版本:2.2.1mysql
python版本:3.6.6sql
mysql版本:mysql-community8.0.15数据库
问题django
在搭建django项目,配置mysql数据库时遇到没法迁移数据库的问题,错误信息以下图:centos
问题分析过程安全
由错误信息,可大体看出是一个叫mysqlclient的包版本不匹配致使的问题。性能
搜索引擎检索相关错误,得知:python访问mysql须要安装对应的驱动包,即将mysql的API接口转换成python格式供数据库应用软件开发者直接调用的第三方库。django2.2默认使用“mysqlclient”这个库去链接mysql,而网上不少教程中使用的是“pymysql”。这两个库有什么区别呢?继续搜索。学习
pymysql、mysqlclient与mysqldbui
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过程当中遇到的一个小问题,从一个小问题一层层深刻、分析问题的缘由,从问题中引出新的问题,层层递进,能够由一点串成一条线甚至到一张网(若是时间容许的话)。问题自己意义不大,但自觉在解决这个问题的过程当中层层递进,由点到线的学习思想颇有总结意义,特记录于此,也可供更多人学习、参考。