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 #关闭防火墙