Qt訪問數據庫的坑還是挺多的。在5.13及以上版本中,QMYSQL驅動被去除了,不能直接使用。在新版本中訪問MySQL還是挺麻煩的,故在此記錄一下。
安裝Qt時的坑
首先前往官網下載Qt:Qt下載地址
這裏我選擇最新的5.14.2目錄下的qt-opensource-windows-x86-5.14.2.exe
.
下載後雙擊安裝,注意選擇組件界面:
此處有兩個注意事項:
- 必須選上Sources,裏面有MySQL依賴的dll
- 要根據MySQL的位數選擇對應的編譯器,如64位的MySQL必須使用64位的MingW才能正常訪問(網傳如此,筆者未測試過32位是否使用)
別的組件根據自己的需求添加即可,安裝部分就講到這裏。
配置驅動
此時我們就可以查看一下Qt中有哪些sql驅動了。
新建一個Qt Console Application項目用於測試,選擇MingW-64bit作爲Debugger.
在.pro文件中加入以下語句,引入sql功能:
QT += sql
main.cpp寫法如下:
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() << driver;
return a.exec();
}
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers)
qDebug() << driver;
return a.exec();
}
輸出結果:
"QSQLITE"
"QODBC"
"QODBC3"
"QPSQL"
"QPSQL7"
輸出結果中並沒有我們想要的QMYSQL驅動,我們需要另行配置。
添加驅動
打開\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers\mysql
目錄下的mysql.pro文件啓動項目,對mysql.pro作出以下修改:
# QMAKE_USE += mysql # 暫時屏蔽mysql
...
INCLUDEPATH += "D:\software\system\mysql-8.0.19-winx64\include" # MySQL安裝路徑下的include目錄
LIBS += "D:\software\system\mysql-8.0.19-winx64\lib\libmysql.lib" # MySQL安裝路徑下的庫文件
DESTDIR = ../mysql/lib/ # 輸出目錄
運行之後會報錯,不要緊,找到同級目錄下的lib目錄,所需dll已經生成:
將生成的dll文件放入對應編譯器的plugins\sqldrivers
目錄中,這裏存放了所有sql驅動,此處我放到Qt5.14.2\5.14.2\mingw73_64\plugins\sqldrivers
中:
再次運行測試程序,輸出結果:
"QSQLITE"
"QMYSQL"
"QMYSQL3"
"QODBC"
"QODBC3"
"QPSQL"
"QPSQL7"
我們所需的QMYSQL驅動已經存在。
添加依賴
有了驅動之後還不夠,我們還需要引入mysql中的dll文件,打開mysql安裝路徑:mysql-8.0.19-winx64\lib
,複製其中的libmysql.dll
和libmysql.lib
到項目編譯後的目錄中,本例爲與項目目錄同級的build-sql_test-Desktop_Qt_5_14_2_MinGW_64_bit-Debug
,這也意味着最後的打包程序中也需要手動添加這兩個依賴。
訪問操作
我們來試驗一個簡單的遍歷全表:
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); // 數據庫類型
db.setHostName("localhost"); // 主機名
db.setPort(3306);
db.setDatabaseName("hello_mysql"); // 數據庫名稱
db.setUserName("root"); // 用戶名
db.setPassword("123"); // 密碼
if(!db.open()){
qDebug()<<"Unable to establish a database connection";
}else{
QSqlQuery query(db);
query.exec("select * from user");
while(query.next())
qDebug()<<query.value(0).toString() // 訪問方式一,通過列數索引
<<query.value("name").toString(); // 訪問方式二,通過列名
db.close();
}
return a.exec();
}
輸出結果:
"1" "雪之下雪乃"
"2" "小木曾雪菜"
"4" "友利奈緒"
"5" "曉美焰"
"6" "冬馬和紗"
"7" "雪之下陽乃"
這就是新版Qt訪問MySQL的全過程。