Qt 数据库操作(Sqlite)

ops/2025/3/14 18:49:04/

数据库简介

关于数据库的基础知识这里就不做介绍了,相关博客可以查看:

SQL基础知识

数据库学霸笔记

上面博客都写的比较详细,本文主要介绍如何使用Qt进行数据库相关操作,数据库分为关系型数据库和非关系型数据,关系型数据库主要有Sqlite、MySQL、Oracle、SQLServer、PostgreSQL等,非关系型数据库主要有Redis、Cassandra、MongoDB等。这次主要介绍Qt使用SQlite数据库。

基础SQL操作

Qt使用数据库工程文件记得引入sql模块:

QT  += sql

数据库初始化:

    //查看支持的数据库驱动for (const QString &driver : QSqlDatabase::drivers()) {qDebug() << driver;}//建立数据库连接m_Db = QSqlDatabase::addDatabase("QSQLITE");//设置本地数据库文件m_Db.setDatabaseName("test.db");//打开数据库if (!m_Db.open()) { qDebug() << "open db fail"; }//创建表QString execSql =QString("create table if not exists testinfo(name varchar(64),id ""varchar(64),createdate varchar(64))");//遍历输出该数据库中所有表名for (const QString &table : m_Db.tables()) { qDebug() << table; }QSqlQuery query;if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }

上述代码中先查看数据库驱动,数据库驱动是应用程序和数据库之间的桥梁,提供访问数据库所需的工具和 API(应用程序编程接口)。查看程序输出打印:

Qt默认支持一些驱动,可以看到有SQlite,但是没有MySQL,如若要用Qt进行MySQL相关数据库操作则需额外安装相关驱动(本文不作介绍)。然后查看生成了对应的数据库文件test.db。

如何查看这个数据库文件了,我推荐使用DB browser for SQLite,使用比较简单,使用该软件打开对应数据库文件:

可以看到我们在代码中创建的表,点击"浏览数据":

数据库表数据相关操作,无非增删查改四种,界面添加对应按钮,编写对应槽函数代码。

增:

void MainWindow::on_insert_clicked() {if (ui->name->text().isEmpty() || ui->id->text().isEmpty()) { return; }if (!m_Db.isOpen()) { return; }QString name = ui->name->text().trimmed();QString id = ui->id->text().trimmed();QString date = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");QString execSql = QString("insert into testinfo (name,id, createdate) ""values('%1', '%2', '%3')").arg(name).arg(id).arg(date);QSqlQuery query;if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}

输入数据点击添加按钮:

查看数据表内容:

 可以看到一条数据已经成功添加。

删:

void MainWindow::on_delete_2_clicked() {if (ui->name->text().isEmpty()) { return; }if (!m_Db.isOpen()) { return; }QString name = ui->name->text().trimmed();QString execSql =QString("delete from testinfo where name = '%1';").arg(name);QSqlQuery query;if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}

我在数据库中添加了一条数据,然后点击按钮删除对应指定name的数据

点击按钮后数据已删除:

 查:

void MainWindow::on_select_clicked() {QString name = ui->name->text();QString id = ui->id->text();QString execSql = QString();if (name.isEmpty() && id.isEmpty()) {execSql = QString("select * from testinfo");} else if (!name.isEmpty() && id.isEmpty()) {execSql = QString("select * from testinfo where name = '%1'").arg(name);} else if (name.isEmpty() && !id.isEmpty()) {execSql = QString("select * from testinfo where id = '%1'").arg(id);} else {execSql =QString("select * from testinfo where name = '%1' and id = '%2'").arg(name).arg(id);}QSqlQuery query;if (!query.exec(execSql)) {qDebug() << query.lastError().text();} else {while (query.next()) {QSqlRecord rec = query.record(); //获取列QStringList vals;for (int i = 0; i < rec.count(); ++i) {vals.append(rec.value(i).toString());}ui->textEdit->append(vals.join(","));}}
}

执行效果不作演示。(select的where用法比较多,详细可以查看文章开头推荐的第一篇博客)

改:

void MainWindow::on_update_clicked() {//修改指定name的id值if (ui->name->text().isEmpty() || ui->id->text().isEmpty()) { return; }if (!m_Db.isOpen()) { return; }QString name = ui->name->text().trimmed();QString id = ui->id->text().trimmed();QString execSql = QString("update testinfo set id = '%1' where name = '%2'").arg(id).arg(name);QSqlQuery query;if (!query.exec(execSql)) { qDebug() << query.lastError().text(); }
}

根据界面输入的name和id,将指定name的数据id改为指定值:

额外补充:删除表为:drop+表名,该操作会将表中所有数据以及表结果删除,如果只是想删除所有数据则为: truncate+表名。

事务

事务是一组操作的集合,这些操作被视为一个单一的工作单元。事务要么完成所有操作,要么取消所有操作,保持数据库在良好的状态下。

比如我现在要一次性插入多条数据,用事务如下编写:

void MainWindow::on_test_clicked() {//使用事务添加100条数据QStringList sqlList;for (int i = 0; i < 100; ++i) {QString execSql = QString("insert into testinfo (name,id, createdate) ""values('%1', '%2', '%3')").arg(i).arg(i).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));sqlList.append(execSql);}if (!m_Db.isOpen()) { return; }m_Db.transaction(); //开启事务for (const QString &execSql : sqlList) {QSqlQuery query(m_Db);bool b = query.exec(execSql);if (!b) {m_Db.rollback(); //失败进行回滚return;}}m_Db.commit(); //事务提交
}

点击按钮后查看数据内容:

 

内容已添加。 


http://www.ppmy.cn/ops/165738.html

相关文章

几种linux获取系统运行时间的方法

在开发 、测试和运维中&#xff0c;获取系统运行时间是一个很重要的参数指标&#xff0c;下面是常用的获取系统时间的方法&#xff0c;以SKYLAB的SKW3000路由模组的运行时间为例进行说明&#xff1a; 一.通过指令获取 获取系统运行时间的指令为uptime&#xff0c;具体操作输出如…

京存助力大型工业制造数字化

工业制造作为实体产业基础的一部分&#xff0c;在国民经济中发挥着举足轻重的作用。各行各业都在谈数字化转型&#xff0c;工业制造业更是数字化转型的重中之重。数字化不仅是将技术运用到生产过程中&#xff0c;更能在数字化的过程中不断积累和形成数字资产&#xff0c;围绕数…

vscode接入DeepSeek 免费送2000 万 Tokens 解决DeepSeek无法充值问题

1. 在vscode中安装插件 Cline 2.打开硅基流动官网 3. 注册并登陆&#xff0c;邀请码 WpcqcXMs 4.登录后新建秘钥 5. 在vscode中配置cline (1) API Provider 选择 OpenAI Compatible &#xff1b; (2) Base URL设置为 https://api.siliconflow.cn](https://api.siliconfl…

Python:函数(一)

python函数相关的知识点 1. 函数定义与调用 定义&#xff1a;使用 def 关键字&#xff0c;后接函数名和参数列表。 def greet(name):"""打印问候语&#xff08;文档字符串&#xff09;"""print(f"Hello, {name}!") 调用&#xff1a…

98. 验证二叉搜索树

文章目录 题目代码原理图方法及解释小结 题目 二叉树&#xff1a;验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前…

《黑客攻防从入门到精通:工具篇》全15章万字深度总结——从工具解析到实战攻防,构建完整网络安全知识体系

目录 一、书籍核心逻辑与学习路径 二、核心模块与工具深度解析 模块1&#xff1a;信息收集与网络扫描 模块2&#xff1a;渗透测试与漏洞利用 模块3&#xff1a;密码攻防与身份认证 模块4&#xff1a;恶意程序攻防 模块5&#xff1a;网络追踪与反追踪 模块6&#xff1a;系…

Java Spring Boot 常用技术及核心注解

一、常用技术 自动配置&#xff08;Auto-Configuration&#xff09; Spring Boot 根据类路径中的依赖自动配置应用程序。例如&#xff0c;引入spring-boot-starter-web会自动配置内嵌 Tomcat 和 Spring MVC。 EnableAutoConfiguration // 启用自动配置起步依赖&#xff08;Sta…

汽车NVH诊断案例 | 纯电车急加速过大弯底盘异响

引言 失去发动机的掩蔽效应后&#xff0c;新能源电车的NVH问题&#xff0c;成为了困扰维修技师新难点。风噪、胎噪、电机高频啸叫等问题更容易车主识别&#xff0c;根源却难以被有效分辨。如何更精准且高效地识别电车NVH问题根源&#xff1f;今天分享的这个案例&#xff0c;内…