Qt MySQL

Qt 5.12.4 版本出现请参考:https://blog.csdn.net/u013894391/article/details/95097583
Qt 5.12.4 没有这玩意: qsqlmysql.dll 请换版本或者自己编译.

下载 MySQL

MySQL下载地址: https://dev.mysql.com/downloads/
在这里插入图片描述
在这里插入图片描述
如果需要debug 可以下载下面 Debug Binaries & Test Suite
注: MySQL x86/x64与 Qt 编译器一致: 例如: Qt5.12.1 + vs2015_x64 (高版本似乎不区分了)
在这里插入图片描述
如果无法打开和下载, 多刷新几次, 如果还不行可能需要科学上网

安装 MySQL 新建建数据库

1.将解压后的 mysql-8.0.18-winx64 的 bin 路径配置到系统环境变量path中(如何配置环境变量可以百度);
2.在解压后的 mysql-8.0.18-winx64 文件夹中新建 data 文件夹;
3.在 mysql-8.0.18-winx64 文件中新建 my.ini 文件内容如下

[client]
port=3306
default-character-set=utf8
[mysqld] 
# 设置为自己MYSQL的安装目录 
basedir=D:\mysql-8.0.18-winx64   #为你 mysql-8.0.18-winx64 文件夹实际路径
# 设置为MYSQL的数据目录 
datadir=D:\mysql-8.0.18-winx64\data #第2步骤新建的 data 文件夹路径
port=3306
character_set_server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER
#开启查询缓存
explicit_defaults_for_timestamp=true
skip-grant-tables

4、进行以上必要的URL配置后,一定以管理员身份运行 cmd ,使用以下命令进行 MySQL 的初始化、安装、启动、建数据库等操作;

mysql -V  
#回车出现 Welcome to the MySQL monitor.  Commands end with ; or \g.
#Your MySQL connection id is 67
#Server version: 58.0.18 MySQL Community Server (GPL)  
#表示你的 mysql 环境变量添加正确,反之检查自己 mysql 的环境变量吧
 
mysqld --initialize

mysqld -install  
#执行成功后,再执行一次可以看到安装位置(有时候对于电脑已有mysql容易查找删除)
#删除服务(管理员权限启动):sc delete MySQL

net start mysql
mysql -u root -p mysql
mysql> create database yeHai; #新建数据名称   注:sql语句结尾处要加 ";"
mysql> show database;        #查看已创建的数据库, 步骤可省略

也可以使用一些可视化工具来查看新建的数据库:
例如: Navicat Premium 12 (有使用期限) ->有一些科学使用方法自己百度琢磨.

在这里插入图片描述

# 启动MySQL服务
    net start mysql
# 关闭MySQL服务
    net stop mysql
    
##用SET PASSWORD命令 修改数据库密码
#mysql> set password for 数据库用户名@localhost = password('新密码'); 
mysql -u root -p # 连接MySQL服务器
mysql> set password for root@localhost = password('mysql'); 

解决 QMYSQL driver not loaded)

1.找到你正在使用 Qt 的 sqldrivers 文件夹把它拷贝到 你编译后的[程序.exe] 相同路径下

D:\Qt\QtVersion\Qt5.12.1\5.12.1\msvc2015_64\plugins\sqldrivers
2.把上面安装的 libmysql.dll 也拷贝到你编译后的[程序.exe] 相同路径下在这里插入图片描述
最终:在这里插入图片描述
编译运行 Qt 大功告成, 如果还提示, 请检查你的 libmysql.dll 是不是从数据库中拷贝出来的. 不要乱用别人的 libmysql.dll. 数据库和 Qt 要使用同一版本的 libmysql.dll

sorry, 再说2句,对直接拷贝到 D:\Qt\QtVersion\Qt5.12.1\5.12.1\msvc2015_64\bin 路径下的行为只能仁者见仁智者见智了. 本人是不喜欢往这里放东西, 多人协作时同步 git 代码怎么办, 人肉广播一下,所有 Qter 都要放?

解决 QSqlDatabasePrivate::database: requested database does not belong to the calling thread.

Qt不同版本间移植时会出现这个错误,由跨线程造成的, 在线程中重新连接一次MySQL即可

//建立一个QMYSQL数据库连接
bool SqlClass::createMySQLConnection(const QString & hostName,
                                     int port,
                                     const QString &userName,
                                     const QString &password,
                                     const QString &dataBaseName)
{
    _connectionName = dataBaseName;
    //fileInfo.completeBaseName() 数据库的文件名,来作为连接名(如果多个db名字一致,则修改此处)
    QSqlDatabase db  = QSqlDatabase::database(_connectionName);
    
    if(!db.isValid()){ //如果db不可用,则添加
        db = QSqlDatabase::addDatabase("QMYSQL", _connectionName);
        db.setHostName(hostName);
        db.setPort(port);
        db.setUserName(userName);
        db.setPassword(password);
        db.setDatabaseName(dataBaseName);
    }
    if( !db.open()){ //判断db是否已经打开
        setErrorString(tr("db not open: %1:%2").arg(dataBaseName).arg(db.lastError().text()));
        return false;
    }
    return true;
}

QSqlDatabase  SqlClass::dbConnection()
{
    QSqlDatabase db = QSqlDatabase::database(_connectionName);
    if( !db.open()){ //判断db是否已经打开
        if (!createMySQLConnection("localhost",3306, "root", "mysql", "user")) {
        //连接错误
        }
    }
    return (db = QSqlDatabase::database(_connectionName));
}

/** 查询
 * @brief SqlClass::query
 * @param sqlStr
 * @return
 */
QVariantList SqlClass::queryList(const QString &sqlStr)
{
    QMutexLocker locker(&_mutex);
    QVariantList list;
    QSqlQuery query(dbConnection());
    
    if(!query.exec(sqlStr)){
        setErrorString(QString("%1:%2").arg(sqlStr).arg(query.lastError().text()));
        return list;
    }else{
        qDebug()<<__LINE__<<__FUNCTION__<<"sql ok:"<<sqlStr;
    }
    //列的个数
    int column = query.record().count();
    qDebug()<<__LINE__<<__FUNCTION__<<"column:"<<column;
    while(query.next()){
        QVariantMap map;
        for(int i=0; i<column; ++i){
            map.insert(QString::number(i),query.value(i));
        }
        list.append(map);
    }
    qDebug()<<__LINE__<<__FUNCTION__<<"list:"<<list<<list.size();
    query.clear();
    return list;
}

解决 QSqlDatabasePrivate::removeDatabase: connection ‘XXX’ is still in use, all queries will cease to work

SqlClass::~SqlClass()
{
    //之所以这么写,是为了消除警告
    //QSqlDatabasePrivate::removeDatabase: connection 'XXX' is still in use, all queries will cease to work
    QSqlDatabase dbTmp;
    dbTmp.database(_connectionName);
    if(dbTmp.isValid()){
        QSqlDatabase *db = &dbTmp;
        if(db->isOpen())
            db->close();
        QSqlDatabase::removeDatabase(_connectionName);
    }
}

Ubuntu18.04 编译 Qt mysql 插件驱动

参考:https://blog.csdn.net/x85371169/article/details/79855728

#安装
sudo apt-get install mysql-server
sudo apt-get install mysql-client   
sudo apt-get install libmysqlclient-dev 
#cd 到sqldrivers目录下
cd /home/hu/Qt5.12.8/5.12.8/Src/qtbase/src/plugins/sqldrivers
qmake -- MYSQL_PREFIX=/user/local
make sub-mysql

#cd 到mysql.pro路径下
cd /home/hu/Qt5.12.8/5.12.8/Src/qtbase/src/plugins/sqldrivers/mysql
sudo /home/hu/Qt5.12.8/5.12.8/gcc_64/bin/qmake "INCLUDEPATH+=/usr/include/mysql"  "LIBS+=-L/usr/lib/x86_64-linux-gnu/ -lmysqlclient" mysql.pro

#最终会在 sqldrivers 目录下生成 sqldrivers/plugins/sqldrivers/
libqsqlmysql.so   libqsqlmysql.so.debug
把 sqldrivers 文件夹拷贝到 你的应用程序.exe目录下即可
sudo service mysql status   #查看mysql服务状态
sudo service mysql start    #启动服务
sudo service mysql stop     #停止服务
sudo service mysql restart  #重启服务

sudo apt-get install ufw #安装防火墙
sudo ufw enable #打开防火墙
sudo ufw status #查看防火墙状态
sudo ufw disable #关闭防火墙


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值