MySQL on Qt (1):安装 MySQL 驱动以及连接 MySQL 与 SQLite
更新于 2021.12.11
文章目录
MySQL on Qt (1): 安装 MySQL 驱动以及连接 MySQL 与 SQLite
写在前面:
大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气,每天晚睡早起撸代码,课都没听,很多知识都是现学现用。
为了避免当时学到的东西给全部忘光光(`_>`,我这脑子啊。。。),所以我把当时大作业的一些核心部分(一些零碎的小细节,能记就记)给记录一下,一方面是复习,一方面也方便以后用到的时候查阅。
这篇文章是大作业 MySQL + SQLite 操作相关部分的第一章,主要讲一下如何安装 MySQL 驱动(Win 下)以及如何连接 MySQL 及 SQLite。
准备部分——安装 MySQL 驱动
还记得跟着教程学 Qt MySQL 操作的时候兴致冲冲地跟着打下了一行行代码,然后编译—运行,卧槽,报错。。。报错信息如下:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QPSQL QPSQL7
"Driver not loaded Driver not loaded"
看一下报错信息,大体的意思就是说 Qt 没有连接 MySQL 的驱动。
查看当前系统环境中的 Qt 支持哪些 Sql 驱动,可以输出一下 QSqlDatabase::drivers() 的值。
坑爹的 Qt 在 Win 下并没有附带 MySQL 的连接驱动,需要我们自行编译。
如果只需要连接远程数据库,那我们本地并不需要安装 MySQL,只要找到 MySQL 提供的 libmysql.dll 和 libmysqld.dll 拷贝到 Qt 的安装目录(%QtDir%/migw.../bin)。网上有教程说 Qt 默认自带已经编译好的 qsqlmysql.dll 和 qsqlmysqld.dll (路径在 %QtDir%/mingw.../plugins/sqldrivers),但是实测这些教程都已经老的不能再老了,我的安装目录下就没有自带的编译好的这两个 dll 文件,接下来我们开始着手安装和编译 MySQL 驱动。
第一步:下载 MySQL DLL文件
扔个地址:
下载下来拷贝一下扔过去就好了。。。
(我记得当时搞了一个老版本的才能用。。。记不清了。。。需要的时候现搞吧。)
第二步: 编译 MySQL 驱动
这一步是重中之重,不巧的是我也忘的差不多了。。。
这里我们需要有 Qt 的源码,可以去下载一下。Qt 全部源码2G大小,我们可以仅选择模块进行下载。
用 Qt 打开源码目录下的\src\plugins\sqldrivers\mysql\mysql.pro。
在末尾加上两句:
INCLUDEPATH += mysql安装目录\include
LIBS += -Lmysql安装目录\lib\ -llibmysql
构建项目后会生成 qsqlmysql.dll 和 qsqlmysqld.dll两个文件,然后拷贝到%QtDir%/mingw.../plugins/sqldrivers文件夹中。
准备部分到这里就大体结束了,理论上 Qt 就已经能成功连接 MySQL 。
上路!连接 MySQL 和 SQLite
配置工程文件
若要使用 Qt 的 SQL 库,则需要在工程文件中添加相应的参数。
CMakeLists.txt:
find_package(Qt5 Sql)
target_link_libraries(Ordering-System-Server PRIVATE Qt5::Sql)
.pro工程文件:
QT += sql
连接数据库
SQL 用到的库主要为:
其中 QSqlDatabase 是最重要的库,数据库的连接及其他基本操作都要在这个类上执行。
连接数据库时,我们主要会用到以下几个函数:
//添加数据库
[static] QSqlDatabase QSqlDatabase::addDatabase(const QString &type, const QString &connectionName = QLatin1String(defaultConnection))
//设置数据库相关信息
void QSqlDatabase::setHostName(const QString &host) //主机地址
void QSqlDatabase::setDatabaseName(const QString &name) //数据库名
void QSqlDatabase::setUserName(const QString &name) //数据库用户名
void QSqlDatabase::setPassword(const QString &password) //数据库密码
void QSqlDatabase::setPort(int port) //数据库端口
这里要特别注意一下addDatabase()这个函数的第二个参数 connectionName ,如果不指定这个参数,每次添加的数据库连接都会被应用程序当作默认连接。当初被这个坑了很久,因为大作业中服务端同时操作着两个数据库,一个远程 MySQL 数据库,一个本地 SQLite 数据库,添加第二个 SQLite 数据库后,就出锅不断,原因就在我没有注意第二个参数。

接下来分别就给一下连接 MySQL 和 SQLite 数据库的范例:
MySQL:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //添加一个数据库
//设置数据库信息
db.setHostName(_dbHost);
db.setDatabaseName(_dbName);
db.setUserName(_dbUser);
db.setPassword(_dbPasswd);
db.setPort(_dbPort);
bool dbRet = db.open(); //连接数据库
if(!ret)
qDebug()<<"Can not open the DB";
else
qDebug()<<"Open the DB successfully.";
SQLite:
因为 SQLite 数据库没有网络层,是一种本地储存的关系型数据库,因此连接的时候与 MySQL 有很大的差别。
//设置数据库文件名
QString dbPath = QDir::currentPath()+"/"+"orders.db";
sqliteDb = QSqlDatabase::addDatabase("QSQLITE","LocalSqlite");
sqliteDb.setDatabaseName(dbPath);
bool ret = sqliteDb.open();
if(!ret)
qDebug()<<"Can not open the DB";
else
qDebug()<<"Open the DB successfully.";
数据库连接成功!
MySQL 部分的第一章到此便结束了, 接下来的一章会讲解一些数据库的基本操作。
补充:
MySQL 与 SQLite 的区别: