前言
最近需要用Qt
写数据库课设,结果配置MySQL
配置了一天半。。。好在结果是好的,终于搞定了。下面写这篇文章来记录配置过程中遇到的坑。
- 对于我自己来说:我学习到了一些配置环境的方法、一些编译原理的知识(感觉之后的编译原理课要好好上了。。)
- 对于看着篇博客的你来说:如果你无法在
Qt
中使用MySQL
,那么这篇文章对你可能有帮助
一、Qt、MySQL安装(均为64位!)
1. Qt版本5.13.2,对应的编译器MinGW版本7.3.0
下载地址:http://download.qt.io/official_releases/qt/5.13/5.13.2/。在安装的过程中,需要选择以下两个组件:
2. MySQL版本8.0.11
安装详情看这篇知乎文章即可:超级详细的mysql数据库安装指南。里面有MySQL 8.0.11
的网盘下载地址以及详细的安装教程。
注意:如果你在安装Qt时选择MinGW作为编译器,那么一定要修改一下MySQL的安装目录!!!
原因:在之后编译MySQL驱动的时候,会添加MySQL中的一些文件的路径。当MinGW在编译文件的时候,是不允许路径中出现空格的。而MySQL的默认路径就是C:/Program Files/MySQL。所以一定一定一定,在安装MySQL的路径中不能出现空格!
修改安装路径的详细方法参见这篇博客:MySQL更改安装路径和Data位置
二、编译MySQL驱动
这是个什么东西呢?这么说吧,如果你想在Qt
中使用MySQL
,你需要以下两种动态库文件(即.dll文件)
1. MySQL
安装目录下D:\MySQL\mysql_8.0.11\lib
的libmysql.dll
文件
2. Qt
安装目录下D:\Qt\5.13.2\mingw73_64\plugins\sqldrivers
的qsqlmysql.dll
文件和qsqlmysqld.dll
文件
这两个文件就是编译MySQL驱动时生成的文件。
顺便说一下,这两个文件在我下载的这个版本的Qt
路径中是没有的,而是通过编译MySQL驱动生成的。(后面详细介绍)
从这些文件中可以看出Qt
支持哪些数据库,比如:sqlite
、odbc
、psql
如何编译驱动?
跟着下面的步骤走,你也可以生成这两个文件!
1. 修改mysql.pro文件
前面说到,Src子目录中有mysql的源文件。而这个就是源文件中的其中一个文件。用Qt
打开它,进行如下修改:
此时,如果直接编译(build),会报两个错误:
(1)Cannot read…qtsqldrivers-config.pri: No such file or directory
解决办法:mysql.pro
的上一级目录中有一个configure.pri
文件。所以可以修改qsqldriverbase.pri
如下:
(2)Project ERROR: Library ‘mysql’ is not defined.
解决办法:注释掉mysql.pro
文件中的QMAKE_USE += mysql
语句
2. 点击构建项目按钮
此时,如果没有报错,说明qsqlmysql.dll
文件和qsqlmysqld.dll
文件已经成功生成。恭喜你,可以进入下一步了!
但是,如果报错了,应该是这个错误(我报的就是这个):
QMYSQL driver not loaded
三、在Qt目录中添加动态库文件
上面说到的两种动态库文件,需要添加到Qt
目录下的某个位置,最终才能成功连接数据库!
1. MySQL
安装目录下D:\MySQL\mysql_8.0.11\lib
的libmysql.dll
文件
先将这个文件复制,然后粘贴到Qt
文件夹的的bin
文件夹下
2. qsqlmysql.dll
文件和qsqlmysqld.dll
文件
经过上面的操作,已经生成了这两个文件,那么这两个文件在哪里呢?最简单粗暴的办法就是直接搜索(我是这样做的。。。)
搜索到这两个文件之后,先将这两个文件复制,然后粘贴到D:\Qt\5.13.2\mingw73_64\plugins\sqldrivers
文件夹下
四、测试连接数据库
可以写一个连接数据库的函数,如下:
#include <QSqlDatabase>
#include <QMessageBox>
#include <QDebug>
#include <QSqlError>
static bool createConnection()
{
QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");//添加一个默认连接,数据库驱动为QMYSQL
//设置主机名有两种方式
//db.setHostName("127.0.0.1");//设置主机名,从MySQL的Workbench中查看
db.setHostName("localhost");//设置主机名
db.setPort(3306);//设置端口
db.setDatabaseName("test_schema");//设置数据库名(这个数据库必须是已经存在的数据库)
db.setUserName("root");//设置用户名
db.setPassword("******");//设置密码(你自己的密码)
if(!db.open())
{
QMessageBox::critical(0,"Cannot open database",
"Unable to establish a database connection.",QMessageBox::Cancel);//提示出错
qDebug()<<db.lastError().text();//输出错误信息
return false;
}
else
{
QMessageBox::information(0,"Successfully","Establish a database connection",QMessageBox::Ok);//提示成功
}
return true;
}
然后去主函数中调用,不出意外的话都会成功。
而恰好我在测试的时候就出现了意外,报错:QMYSQL driver not loaded
。关于这个报错,我参考了如下这篇博客:QMYSQL driver not loaded 的原理和解决办法。其中说到,即使两种动态库文件都已经添加到Qt
目录中,仍有可能报错,原文如下:
我的解决方案:找到了一篇博客,里面有一个libmysql.dll
文件的网盘下载地址:【Qt】Qt5.12编译MySQl5.7驱动(亲自测试成功)
下载之后,把之前添加的libmysql.dll
换成下载的这个libmysql.dll
文件,然后就成功连接数据库了。我觉得原因可能就是上面这篇博客说的原因,但是我也不知道为什么按照这个流程走下来的两种动态库文件不配套,也不知道如果要让他们配套应该怎么做。。。如果有人知道的话,还望指点指点小弟^^
配环境真的是太累了,不过配置成功之后还是蛮有成就感的。
Over!