MySQL on Qt (1): 安装 MySQL 驱动以及连接 MySQL 与 SQLite

写在前面:

大一下学期的 CPP 大作业“自主订餐系统”可真是颇费了一些力气,每天晚睡早起撸代码,课都没听,很多知识都是现学现用。

为了避免当时学到的东西给全部忘光光(`_>`,我这脑子啊。。。),所以我把当时大作业的一些核心部分(一些零碎的小细节,能记就记)给记录一下,一方面是复习,一方面也方便以后用到的时候查阅。

这篇文章是大作业 MySQL + SQLite 操作相关部分的第一章,主要讲一下如何安装 MySQL 驱动(Win 下)以及如何连接 MySQL 及 SQLite。

准备部分——安装 MySQL 驱动

还记得跟着教程学 Qt MySQL 操作的时候兴致冲冲地跟着打下了一行行代码,然后编译—运行,卧槽,报错。。。报错信息如下:

1
2
3
4
5
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.dlllibmysqld.dll 拷贝到 Qt 的安装目录(%QtDir%/migw.../bin)。网上有教程说 Qt 默认自带已经编译好的 qsqlmysql.dllqsqlmysqld.dll (路径在 %QtDir%/mingw.../plugins/sqldrivers),但是实测这些教程都已经老的不能再老了,我的安装目录下就没有自带的编译好的这两个 dll 文件,接下来我们开始着手安装和编译 MySQL 驱动。

第一步:下载 MySQL DLL文件

扔个地址:

https://dev.mysql.com/downloads/connector/cpp/

下载下来拷贝一下扔过去就好了。。。

(我记得当时搞了一个老版本的才能用。。。记不清了。。。需要的时候现搞吧。)

第二步: 编译 MySQL 驱动

这一步是重中之重,不巧的是我也忘的差不多了。。。

这里我们需要有 Qt 的源码,可以去下载一下。Qt 全部源码2G大小,我们可以仅选择模块进行下载。

用 Qt 打开源码目录下的\src\plugins\sqldrivers\mysql\mysql.pro

在末尾加上两句:

1
2
INCLUDEPATH += mysql安装目录\include
LIBS += -Lmysql安装目录\lib\ -llibmysql

构建项目后会生成 qsqlmysql.dllqsqlmysqld.dll两个文件,然后拷贝到%QtDir%/mingw.../plugins/sqldrivers文件夹中。

准备部分到这里就大体结束了,理论上 Qt 就已经能成功连接 MySQL 。

上路!连接 MySQL 和 SQLite

配置工程文件

若要使用 Qt 的 SQL 库,则需要在工程文件中添加相应的参数。

CMakeLists.txt:

1
2
find_package(Qt5 Sql)
target_link_libraries(Ordering-System-Server PRIVATE Qt5::Sql)

.pro工程文件:

1
QT += sql

连接数据库

SQL 用到的库主要为:

1
2
3
4
5
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlRecord>
#include <QSqlQuery>
#include <QSqlIndex>

其中 QSqlDatabase 是最重要的库,数据库的连接及其他基本操作都要在这个类上执行。

连接数据库时,我们主要会用到以下几个函数:

1
2
3
4
5
6
7
8
//添加数据库
[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 数据库后,就出锅不断,原因就在我没有注意第二个参数。

Qt Doc中关于 addDatabase的介绍

接下来分别就给一下连接 MySQL 和 SQLite 数据库的范例:

MySQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 有很大的差别。

1
2
3
4
5
6
7
8
9
10
11
12
//设置数据库文件名
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 的区别:

https://blog.csdn.net/zbw1185/article/details/47975965