寫在前面:
本文內容包括:
(1)分析”QSqlDatabase: QMYSQL driver not loaded”出現的原因
(2)解決“QSqlDatabase: QMYSQL driver not loaded”的方法總結
一、背景
在使用Qt操作MySQL數據庫過程中,使用Qt編寫好連接MySQL數據庫的的代碼后,編譯調試時報錯QSqlDatabase: QMYSQL driver not loaded,意味着Qt應用程序與MySQL數據庫連接失敗。報錯如下圖所示:
本工程項目開發環境為:
(1)操作系統:Windows
(2)MySQL版本為:8.0
(3)Qt版本為:5.13
(4)QtCreator版本 為:4.9.1
二、分析”QSqlDatabase: QMYSQL driver not loaded”出現的原因
根據上圖的報錯提示,查閱官方文檔,鏈接:https://doc.qt.io/qt-5/sql-driver.html#qmysql-for-mysql-4-and-higher,得到相關信息,如下
(1)Qt SQL模塊使用驅動程序插件與不同的數據庫api進行通信。
(2)支持的數據庫如下:
根據報錯信息提示可用的drivers是: QSQLITE QODBC QODBC3 QPSQL QPSQL7,其中沒有QMYSQL驅動。於是乎定位問題出現的原因是:缺少QMYSQL驅動。
查閱計算機Qt安裝路徑:D:\ProgramFiles\Qt\5.13.0\mingw73_32\plugins\sqldrivers 的sqldrivers插件,如下
發現其中沒有與MySQL相關的驅動插件。
三、解決“QSqlDatabase: QMYSQL driver not loaded”的方法總結
原來Qt5.13版本下不包含有驅動MySQL的驅動插件,那么就需要自己編譯插件了。編譯插件的過程如下:
在編譯插件之前需准備兩個源碼包:
(1)需要一個與MySQL連接的擴展包:mysql-connector-c-6.1.3-win32,資源下載鏈接為:https://dev.mysql.com/downloads/file/?id=450611
(2)Qt的源碼,在安裝Qt的時候,可以選擇安裝資源來確保同時將Qt的源碼也安裝到自己的電腦上。
兩個源碼包的資源文件如下圖所示:
接下來,開始編譯源碼,如何編譯Qt源碼這里不細說了。
(1)使用windows命令行切換到該MySQL驅動工程路徑下,使用qmake生成相應的makefile文件。
(2)使用mingw32-make編譯該工程。
在編譯過程中,出現了如下錯誤:
提示在qsql_mysql_p.h頭文件中找不到mysql.h的頭文件。說明mysql.頭文件沒有引入到該工程中。於是在該工程的.pro文件中添加包含路徑和庫文件路徑,添加后文件如下:
(此處添加了用於MySQL連接的擴展包:mysql-connector-c-6.1.3-win32的頭文件和資源路徑)
添加完成后,重新使用qmake工具生成makefile文件,然后使用mingw32-make編譯該工程文件,編譯完成后,可以使用mingw32-make install完成插件的安裝,也可以不用,手動復制插件到指定路徑即可。編譯完成后,將生成如下MySQL的驅動組件:
(路徑為D:\ProgramFiles\Qt\5.13.0\Src\qtbase\src\plugins\sqldrivers\plugins\sqldrivers)
(3)將其中的qsqlmysql.dll文件和qsqlmysqld.dll文件復制到 D:\ProgramFiles\Qt\5.13.0\mingw73_32\plugins\sqldrivers,注意這里是D:\ProgramFiles\Qt\5.13.0\mingw73_32文件夾中
(4)進行測試,在QtCreator中編譯運行自己寫好的MySQL連接程序,又出現報錯,如下圖:
此時分析報錯,QMYSQL驅動已經存在,然而依然不能連接到MySQL數據庫。於是將MySQL連接的擴展包:mysql-connector-c-6.1.3-win32中的lib文件夾下的libmysql.dll和libmysql.lib(該ibmysql.lib文件可以不要)文件復制到Qt構建套件路徑D:\ProgramFiles\Qt\5.13.0\mingw73_32\bin下,如下圖:
重新測試,於是乎可以連接到MySQL數據庫了。
(四) 總結
總而言之,使用了Qt sql模塊來操作MySQL數據庫,需要三個庫文件來支持,分別為:libmysql.dll、qsqlmysql.dll文件和qsqlmysqld.dll文件,三個文件缺一不可。若在Qt安裝路徑的插件文件夾路徑下(D:\ProgramFiles\Qt\5.13.0\mingw73_32\plugins\sqldrivers )找不到對應的驅動擴展,那么就需要編譯相應的驅動擴展文件到相應路徑。同時要將用於與MySQL連接的擴展包:mysql-connector-c-6.1.3-win32文件下的libmysql.dll庫文件復制到Qt構建套件路徑D:\ProgramFiles\Qt\5.13.0\mingw73_32\bin文件夾中,確保能與MySQL連接成功。
(注:在使用Qt編寫數據庫連接層代碼時,可以使用QSqlDatabase::drivers()方法來查看Qt當前開發環境下有哪些可用的數據庫驅動程序)