本文章是在Qt Creator 上配置MySQL开发环境,以及在服务器上安装配置MySQL服务的整个流程,并包含众多配置过程中可能遇到的问题。按照本文内容,注意细节,配置就可以非常顺畅。
需要配置服务器端或者本地有架设MySQL服务进行测试需求的按全流程进行,只需要配置Qt开发环境从编译qsqlmysqld.dll、qsqlmysql.dll开始阅读即可。
作者完成配置时的环境:
Qt Creator:4.11.2 (Based on Qt 5.14.2 [MSVC 2017, 32bit] )
编译文件时使用的MySQL:mysql-5.7.41-win32
服务器端MySQL服务:mysql-installer-web-community-8.0.32.0
程序编译时使用的Kit:Desktop Qt 5.12.8 MinGW 32-bit (debug)
配置步骤:
- 配置服务器MySQL80服务
- 编译qsqlmysqld.dll、qsqlmysql.dll文件,放置libmysql.dll、libmysqld.dll、libmysql.lib
- Qt项目配置Pro文件
目录
编译qsqlmysqld.dll、qsqlmysql.dll
配置服务器MySQL80服务
1.请参考这篇文章:MySQL安装教程(详细)服务器端以管理员权限登录后,打开mysql-installer-web-community-8.0.32.0安装,与参考文章的出入在于选择自定义安装(Custom),然后选择自定义路径(参考:安装MYSQL自定义安装路径),避免路径中出现空格,自定义安装时选择MySQL Server 5.7.41,此处可能显示x86,没什么问题继续安装即可。当然如果有需求请自行修改。我使用Navicat Premium 16来连接MySQL和操作数据库。注意安装过程中牢记设置的密码,安装界面到如下图所示处可以添加一个用户用于后期客户端访问:
此处我创建了user_account账户,点击Add User添加并把所有权限授予该账户。
此处也可以先新建,后期在Navicat Premium 16中设置,具体如下:
此处点击用户,选中刚才创建的用户user_account,点击“权限”,为新建的数据库添加权限。这里方便试调权限全开了,但是后期实际使用应该只具备你需要的权限以保证安全。
2.完成了服务器MySQL服务安装后,测试本地连接是否成功。本地连接正常后,设置公网端口规则。若使用标准端口,服务器的防火墙应允许3306访问,非标准端口自行设置防火墙规则。(阿里、腾讯云等于网页端防火墙规则内添加相应端口)
3.修改配置文件my.ini,配置以跳过SSL验证,此处设置会导致SSL和TLS验证不启用,因为在实际测试中,存在Qt项目没配置SSL被拒绝连接的情况,也存在不修改ini但是可以连接的情况,为了避免遇到问题,此处预先关闭。若有SSL需求的自行研究这块怎么做到Qt中去。
(1)找到my.ini文件,一般在下方的路径中:
右键编辑,用记事本打开,底部添加下述内容,然后另存为保存同名同目录,修改保存编码为ANSI,提示可能会缺失内容点确定,然后覆盖掉原先的文件(否则无法重启MySQL80并报错:本地计算机上的MySQL80 服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止):
[mysqld]
skip_ssl
保存后重启服务,可以进入MySQL的bin目录手动启动,也可以在服务菜单中重启服务:
至此完成了服务端MySQL服务配置。
编译qsqlmysqld.dll、qsqlmysql.dll
1.由于我使用的Qt Creator本身是32位,故选择老版本的32为MySQL来作为dll编译库,这里注意并不是Kit位数对应,而是Qt Creator位数对应。编译前需要确保Qt有Src,如果没有请先下载安装Src。可在此目录查看到:
2.下载并安装mysql-5.7.41-win32,安装到一个无空格,无中文的目录下,例如:
这里正常安装即可,服务正常与否不影响,我们只需要用它的文件,需要在本地调试程序的按照上方服务器配置的方法一样配置即可。
3.向系统环境变量PATH添加解释器的路径和MySQL路径,参考:
4.添加后打开下面这个目录中的mysql.pro,在Qt Creator中查看项目(D:\Qt\Qt5.12.8\5.12.8\Src\qtbase\src\plugins\sqldrivers\mysql):
向pro文件添加下述内容:(根据你的路径修改)
DESTDIR = ../mysql/lib
INCLUDEPATH += "D:/MySQL/mysql-5.7.41-win32/include"
LIBS += "D:/MySQL/mysql-5.7.41-win32/lib/libmysql.lib"
DEPENDPATH += $$quote(D:/MySQL/mysql-5.7.41-win32/include)
注释下述内容:
#QMAKE_USE += mysql
最终如下:
打开qsqldriverbase.pri
内容如下:
QT = core core-private sql-private
include(./configure.pri)
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
之后点击运行,如果成功,有个弹窗直接关闭即可,下方目录生成四个文件(根据我们环境和Kit编译出来的动态链接库),如果遇到一堆报错,无法编译出的话,查看文章最下方可能遇到的错误手动编译即可:
参考路径:D:\Qt\Qt5.12.8\5.12.8\Src\qtbase\src\plugins\sqldrivers\plugins\sqldrivers
复制qsqlmysqld.dll、qsqlmysql.dll到Kit的plugins-sqldrivers路径下:
参考路径:D:\Qt\Qt5.12.8\5.12.8\mingw73_32\plugins\sqldrivers
复制下面路径中(D:\MySQL\mysql-5.7.41-win32\lib)的
libmysql.dll和libmysql.lib 文件到D:\Qt\Qt5.12.8\5.12.8\mingw73_32\bin目录下
复制到:
至此完成了Qt环境的MySQL配置工作。
Qt项目配置Pro文件
1.新建一个项目,向pro文件添加内容:
QT += sql
CONFIG += mysql
2.需要使用MySQL的头文件添加声明:
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>
3.运行测试代码测试是否能够成功连接,此处我预先在数据库添加了表account并有username和password做查询测试:
void MySQL_connect_test()
{
// 创建数据库连接
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("你的MySQL IP地址,本地是localhost");
db.setDatabaseName("数据库名");
db.setUserName("登录名");
db.setPassword("登录密码");
if (!db.open()) {
qDebug() << "Database error occurred";
return;
}
// 执行查询(这里是一个包含用户名和密码的表account)
QSqlQuery query("SELECT * FROM account");
while (query.next()) {
QString username = query.value(0).toString();
QString password = query.value(1).toString();
qDebug() << "username: " << username << ", password: " << password ;
}
// 关闭数据库连接
db.close();
}
至此完成所有配置,希望对你有所帮助。
可能遇到的错误:
1.mysql编译不通过:检查MySQL和Qt位数是否一致,Kit可能也需要对应(未测试Kit的影响)
2.提示main.moc报错:手动进入mysql.pro的路径,管理员启动cmd输入下方内容手动编译:
moc main.cpp -o main.moc
同样,在目录下的cmd输入下方内容手动编译:
qmake
mingw32-make.exe