前置條件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過程當中遇到的一個小問題,從一個小問題一層層深刻、分析問題的緣由,從問題中引出新的問題,層層遞進,能夠由一點串成一條線甚至到一張網(若是時間容許的話)。問題自己意義不大,但自覺在解決這個問題的過程當中層層遞進,由點到線的學習思想頗有總結意義,特記錄於此,也可供更多人學習、參考。