Qt 連接MySQL 是件很簡單的事,但也有可能很不簡單。
QT給我們的提示只有 QMYSQL driver not loaded
,讓我們毫無頭緒。訪問其他數據庫也可以用同樣的方法解決。
Qt 訪問 MySQL 需要 2 個動態鏈接庫文件,一個是 Qt 自己的 MySQL 驅動插件
,另一個是 MySQL 提供的動態鏈接庫
,缺一不可。在程序里指定要訪問的數據庫為 MySQL,Qt 會自動的加載 MySQL 驅動插件
,其實現依賴於MySQL 的動態鏈接庫
訪問 MySQL。
#include <iostream> #include <QSqlDatabase> #include <QDebug> using namespace std; int main() { QSqlDatabase d = QSqlDatabase::addDatabase("QMYSQL"); d.setHostName("127.0.0.1"); d.setDatabaseName("dbName"); d.setPort(3306); d.setUserName("root"); d.setPassword("root"); if(d.open()) cout<<"Hi mysql!連接"<<endl; else cout<<"失敗"<<endl; qDebug()<<QSqlDatabase::drivers()<<endl; return 0; }
運行上面的代碼,QT只給我們驅動沒有加載的提示。Qt 5 的 SDK 默認提供了編譯好的 MySQL 驅動插件,位於 plugins/sqldrivers
(Mac OS 下為 libqsqlmysql.dylib
,Windows 下為 qsqlmysql.dll
),這個可以直接使用。但如果用的是 Qt 4,很不幸, 需要我們自己編譯 MySQL 的驅動插件,而且不同的系統,不同的編譯器中步驟有所區別,需要相當大的篇幅才能講清楚。接下來還需要MYSQL的動態鏈接庫:
1 #include <QSqlDatabase> 2 #include <QSqlQuery> 3 #include <QSqlError> 4 #include <QPluginLoader> 5 #include <QDebug> 6 7 void loadMySqlDriver(); 8 9 int main(int argc, char *argv[]) { 10 11 loadMySqlDriver(); 12 return 0; 13 } 14 15 void loadMySqlDriver() { 16 QPluginLoader loader; 17 // MySQL 驅動插件的路徑 18 loader.setFileName("/Users/Stdu/Qt5.6.1/5.6/clang_64/plugins/sqldrivers/libqsqlmysql.dylib"); 19 qDebug() << loader.load(); 20 qDebug() << loader.errorString(); 21 }
執行上面的代碼,終於能看到問題出在哪里,需要opt/..../libmysqlclient.18.dylib
這個動態鏈接庫。
我的MYSQL是5.7,其中包含的動態鏈接庫是libmysqlclient.20.dylib,但我想了想這個庫就是連接MYSQL的關鍵所在,將其改名為
libmysqlclient.18.dylib
,放在opt/.../下。連接成功。
參考:http://qtdebug.com/DB-AccessMySQL.html