好记性不如烂笔头,今天被Qt连接mysql折腾半天,终于解决了,赶紧做个记录,以便后续翻阅
本文是在已经正确安装mysql8的基础上进行,若未完成mysql8的安装,可按照上一篇笔记进行操作
本文在Qt5.12.12,Qt5.15.2使用对应版本的MSVC验证通过,下文以Qt5.12.12为例进行说明,Qt5.15.2几乎一样,MinGW也类似
开发环境:
- Qt版本:Qt5.12.12、Qt5.15.2
- 编译器:MSVC2017 64位、MSVC2019 64位
- MySQL版本:8.0.29
一、编译mysql
Qt5.12.12或Qt5.15.2默认是没有mysql的驱动,如果直接新建连接mysql数据库的工程并运行,会提示以下错误
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
故首先应对mysql的源码进行编译,这里需要注意,编译器的版本和位数不能换,否则无法使用
-
进入D:\Qt\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql目录,打开mysql.pro工程
-
打开mysql.pro文件,对其进行编辑
-
首先将QMKE_USE += mysql 注释掉
-
添加安装好的mysql的库文件和头文件目录
TARGET = qsqlmysql HEADERS += $$PWD/qsql_mysql_p.h SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp # 步骤1:将QMAKE_USE += mysql注释掉 # QMAKE_USE += mysql OTHER_FILES += mysql.json PLUGIN_CLASS_NAME = QMYSQLDriverPlugin include(../qsqldriverbase.pri) # 步骤2:添加mysql的库文件和头文件目录 LIBS += "C:/mysql-8.0.29-winx64/lib/libmysql.lib" INCLUDEPATH += "C:/mysql-8.0.29-winx64/include" DEPENDPATH += "C:/mysql-8.0.29-winx64/include"
-
-
打开qsqldriverbase.pri,对其进行编辑
- 将include( s h a d o w e d ( shadowed( shadowed(PWD)/qtsqldrivers-config.pri)注释掉,改为include(./configure.pri)
QT = core core-private sql-private # For QMAKE_USE in the parent projects. # 步骤3:注释掉include($$shadowed($$PWD)/qtsqldrivers-config.pri),改为include(./configure.pri) # include($$shadowed($$PWD)/qtsqldrivers-config.pri) include(./configure.pri) PLUGIN_TYPE = sqldrivers load(qt_plugin) DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
-
左下角,构建方式选择为Release
-
点击左上角工程名mysql,执行qmake
-
点击左下角编译按钮(小锤子)
由于我的Qt安装在D盘,故生成的文件在 D:\plugins\sqldrivers里
二、拷贝库文件
-
将编译好的目录内qsqlmysql.dll、qsqlmysqld.dll拷贝到D:\Qt\5.12.12\msvc2017_64\plugins\sqldrivers目录内
-
将C:\mysql-8.0.29-winx64\lib下libmysql.dll,C:\mysql-8.0.29-winx64\bin下libcrypto-1_1-x64.dll和libssl-1_1-x64.dll拷贝到D:\Qt\5.12.12\msvc2017_64\bin目录下
注:libcrypto-1_1-x64.dll和libssl-1_1-x64.dll是libmysql.dll执行需要使用的动态库,需要将其一起拷贝到编译器的bin目录下
三、创建测试数据库
进入mysql,创建名为test的数据库(create database test)
PS C:\mysql-8.0.29-winx64\bin> .\mysql -uroot -p
Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.29 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
mysql> quit
Bye
PS C:\mysql-8.0.29-winx64\bin>
四、Demo工程
打开Qtcreator,新建工程,为了方便,我选择了console,工程名为mysqltest,打开mysqltest.pro,增加 QT += sql
QT -= gui
# 步骤1
QT += sql
CONFIG += c++17 console
CONFIG -= app_bundle
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
main.cpp
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
打开main.cpp,增加测试代码
#include <QCoreApplication>
// 步骤2:增加头文件
#include <QSqlDatabase>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 步骤3:连接mysql的test数据库测试代码
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1"); //连接本地主机
db.setPort(3306);
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("123456");
bool ok = db.open();
if (ok){
qDebug()<< "infor link success";
}
else {
qDebug()<< "infor link failed";
qDebug()<<"error open database because"; //<<db.lastError().text();
}
return a.exec();
}
点击运行,程序输出窗口可看到已经成功连接
00:10:56: Starting C:\Users\sos_l\Documents\build-mysqltest-Desktop_Qt_5_12_12_MSVC2017_64bit-Debug\debug\mysqltest.exe...
infor link success