Qt MySQL

mac2025-05-23  44

Qt 使用 MySQL

下载 MySQL安装 MySQL 新建建数据库解决 QMYSQL driver not loaded)解决 QSqlDatabasePrivate::database: requested database does not belong to the calling thread.解决 QSqlDatabasePrivate::removeDatabase: connection 'XXX' is still in use, all queries will cease to work Ubuntu18.04 编译 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] 相同路径下

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 #关闭防火墙
最新回复(0)