QT知识整合--数据库操作

news/2024/9/19 9:18:59/文章来源:https://www.cnblogs.com/xiaochenggk/p/18399465

  不管是在哪使用数据库,终归是需要学习sql语言的,所以还没学的小伙伴建议打道回府先去把数据库学了再来看。

  我自己将QT中一些常用的数据库分为内部数据库和外部数据库。这所谓的内部数据库就是像“SQLite”这种大部分使用场景是嵌入式的,它将整个数据库存储在一个单一的文件中,没有独立的数据库服务器进程。应用程序直接使用它来管理数据,数据库引擎作为应用程序的一部分运行,它适用于小型项目,这样的好处就是不需要单独的数据库服务器,。而外部服务器也就是我们常说的“Mysql”“oracle”“PostgreSQL”等,说白了就是在开发过程中接入QT外部的数据库。

  总结一下来说内部数据库就是在开发过程中将数据库整合到应用程序中,非常适合小项目以及嵌入式项目开发。而外部数据库是一个单独的个体,需要应用程序连接外部数据库使用的,适合于大项目,什么是大项目应该不用我说吧。再从另一方面来说像SQLite这种我们定义为轻量级数据库,它保留一些像oracle一些大型数据库的部分功能变为体积更小的“数据库青春版”。之所以不直接讲像Mysql这种大体积的数据库是因为QT中本身就嵌入了SQlite,我们在开发小项目的时候是不需要安装并配置动态库的。

  本章要讲的内容我也会分为内部数据库和外部数据库来讲:

  一、内部数据库(SQLite)

  (一)sql模块

  和网络编程一样,我们新创建的默认项目后,需要手动在.pro手动添加sql,这样我们才能代码中引用与数据库相关的库类。

  (二)数据库在QT中使用的整个流程

  对于数据库而言不管是在什么项目里面还是用什么技术开发与数据库相关的技术时使用数据库的步骤大致是差不多的。如下:

  1、创建数据库对象(数据库实例化)

  2、连接数据库

  3、使用数据库(平常说的增、删、改、查)

  4、关闭数据库

  (三)QT带给我们的一些操作数据库的api

  1、数据库操作

QSqlDatabase
该类提供对数据库操作行为的各种函数,其中包括创建、删除、复制和关闭数据库。

  2、表数据操作

  说句老实话,QT中数据库操作有这两个类就可以完成大部分数据库的操作。无非就是连接数据库和操作数据库表数据这两种而已。像后面需要罗列的行数据记录和列数据记录这都是为了简化开发步骤的函数,需要记得太多了。作为初学者搞懂这两个类的使用就可以了,剩下的在开发工作中慢慢积累。

QSqlQuery
该类提供一些组合用来执行sql语句。

  (四)类使用和实操代码

  1、模块添加

QT += sql

  2、api添加

  讲解部分我都给写进代码注释里面了,直接下载看或者github上面在线看。

  操作数据库有这三个就大致够了。第一个进行数据库本身的操作,也就是创建或者删除数据库操作,建表删表等。

  第二个进行数据的操作,也就是表中存储的数据。但前两者本质还是使用的sql语言。

  第三个看名字就知道一种报错机制。如果我们在开发工程中遇到数据库的使用问题就可以使用这个类来输出报错内容,我个人觉得这是非常重要的一个类。天下苦bug久已!!!

#include <QSqlDatabase>
#include <QSqlQuery>
//#include <QDebug>
#include <QSqlError>

  3、检查QT框架中有哪些数据库

  drivers是QT中的一个静态函数,用于返回系统上可用的数据库驱动列表。使用这个函数我们就可以在控制台里面输出QT可用的数据库驱动。

QSqlDatabase::drivers
qDebug()<<QSqlDatabase::drivers()<<endl;//使用方法
00:30:27: Starting /home/xiaochenggk/QT/build-QSql-Desktop_Qt_5_12_12_GCC_64bit-Debug/QSql ...
Warning: Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway.
("QSQLITE", "QMARIADB", "QMYSQL", "QMYSQL3") //控制台输出内容

  输出内容中括号里就是可用数据库的列表,可以看到除开sqlite以外还有mysql可以使用。这里提一句,QT中从QT5开始就不再内嵌除开sqlite的驱动了,所以如果我们需要使用外部数据库的时候需要自己去添加其他数据库驱动。这里输出列表中的mysql就是我自己手动添加的数据库驱动,正常是不会出现mysql的。

  而且不管是内部数据库还是外部数据库他们在QT中的配置代码和sql语言都是差不多的(唯一不同就是需要多一些配置,类似于账号密码的操作登录数据库再连接)。后面讲外部数据库的时候我只会教一下如何编译数据库驱动和安装数据库。

  4、创建数据库连接

  使用addDatabase指定数据库驱动,也就是说指定使用什么数据库。再由setDatabaseName来指定数据库文件存放的本地文件地址,如果指定的位置没有已存在的文件QT会自动给你创建一个。再使用open连接数据库,这一个完整的步骤就算完成了。

  来看看代码部分:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//指定数据库驱动
db.setDatabaseName("数据库文件地址,例如/home/xiaochenggk/QT_Sqlite_project");
//指定数据库文件的存放地址if (!db.open()) {//这里你可以单独把db.open()拿出来执行,我这样写的好处//可以通过一套输出语句来判断数据库是否连接成功qDebug() << "无法打开数据库:" << db.lastError().text();return;
}

  5、数据操作

  (1)创建表

  前面都是使用QSqlDatabase操作的数据库的内容,这里对数据的操作就需要使用QSqlQuery里面的内容了。

  我们来试试创建表,在数据库结构中,表才是真正意义上用来存放数据的结构,创建的数据库也是用来存放表。创建数据我们需要建立一个QSqlQuery对象,之后创建一个变量用来存储sql语句将这个变量传给QSqlQuery的exec函数执行就可以了,这样一个创建表的工作就算是完成。核心函数为exec。

QSqlQuery query;//QSqlQuery对象
QString createTable = "CREATE TABLE IF NOT EXISTS students (""id INTEGER PRIMARY KEY AUTOINCREMENT, ""name TEXT, ""age INTEGER)";//使用变量来存储一段sql语句,以供给//后续工作使用
if (!query.exec(createTable)) {//这里就是将createTable的值传给execqDebug() << "创建表失败:" << query.lastError().text();
}

  (2)增

  建好表以后就要往表里面插入数据了。后面我也按照增删改查的顺序一个一个的都写个例子照着写就行,主要还是需要自己学习sql语言。

  第一行使用QSqlQuery中的prepare函数运行一个带有占位符的sql语句,然后二三句addBindValue用于向占位符绑定实际的值,确保sql语句中的占位符可以插入正确的值。之所以这么写,考虑到ui界面输入数据可以直接插入数据库中,然后addBindValue中的值可以跟一个lineEdit控件绑定,将lineEdit输入的值传给占位符。

query.prepare("INSERT INTO students (name, age) VALUES (?, ?)");
query.addBindValue("Alice");
query.addBindValue(22);
if (!query.exec()) {qDebug() << "插入数据失败:" << query.lastError().text();
}

  到这里不难看出创建表的时候和插入数据的时候对exec使用有些不一样。创建表时exec是有一个值传入的,而插入数据的时候并还没有,这是因为exec函数的使用有两种方式。一种就如创建表的时候一样直接传值使用,或者直接exec函数中给一个sql语句。而第二种就是结合prepare和addBindValue一起使用,由这两个函数写好的sql语句,代码中是不需要直接给exec传值的。

  (3)删

query.prepare("DELETE FROM students WHERE name = ?");
query.addBindValue("Alice");
if (!query.exec()) {qDebug() << "删除数据失败:" << query.lastError().text();
}

  (4)改

query.prepare("UPDATE students SET age = ? WHERE name = ?");
query.addBindValue(23);  // 更新后的年龄
query.addBindValue("Alice");  // 要更新的学生名字
if (!query.exec()) {qDebug() << "更新数据失败:" << query.lastError().text();
}

  (5)查

query.exec("SELECT * FROM students");
while (query.next()) {QString name = query.value("name").toString();int age = query.value("age").toInt();qDebug() << "学生:" << name << ", 年龄:" << age;
}

  (6)关闭数据库

db.close();

 

  二、外部数据库(Mysql)

  外部数据库大部分内容和sqlite是类似的,或者说是数据库的操作是一样的。但是与sqlite不同的是mysql或者说所有外部数据库是需要类似于账户密码的验证过程的。

db.setHostName("localhost");       // 数据库主机名
db.setDatabaseName("my_database"); // 数据库名称
db.setUserName("root");            // 数据库用户名
db.setPassword("password");        // 数据库密码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/794763.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.1 gradio的基本使用详解

gr.Text:用于文本输入,适用于自然语言处理任务的模型。 gr.Image:用于图像上传,适用于图像处理或计算机视觉模型。 gr.Audio:用于音频输入,适用于语音识别或音频处理模型。import gradio as grdef greet(name):return "Hello " + name + "!"demo = g…

WRF设置模式垂直层

翻译自WRF论坛https://forum.mmm.ucar.edu/threads/stretched-vertical-levels-information.14975/#post-37729设置模式垂直层​ Eta 层由 real 自动计算,基于namelist选项“e_vert.”所设置的层数。然而,完整的eta 层次可以由namelist选项“eta_levels.”来显式的指定。层次…

3.MR

MR一.MR概述1.mr定义Mr是一个分布式运算程序的编程框架,是用户开发”基于hadoop的数据分析应 用”的核心框架Mr核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整地 分布式运算程序,并发运行在一个hadoop集群上2.mr优缺点2.1.优点(1)易于编程.用户只关心业务逻辑…

4.MR(1)

2.mapreduce工作流程流程一流程二3.shuffle3.1.shuffle机制map方法之后,reduce方法之前的数据处理过程称之为shuffle3.2.分区3.3.writablecomparable排序(1)排序概述(2)排序分类3.4.combiner合并

5.MR(2)

4.输出数据outputformat接口实现类5.mapreduce内核源码解析5.1.maptask工作机制(1)read阶段:maptask通过inputformat获得的recordreader,从输出 inputsplit中解析一个个key/value5.2.reducetask工作机制5.3.reducetask并行度决定机制6.join6.1.reduce join6.2.map join7.数据清…

南京某大学入门知识

某大学入门知识一家之言,不必在意。 某高校文档镇楼https://github.com/SurviveSJTU/SurviveSJTUManual 地图 雷丁楼 楼主参加融媒体中心报名时,去过一次,其他时候没去过(雷丁学院,类似于与国外合作的专业) 东苑体育场 有体育馆,有室内羽毛球(二楼),击剑(二楼),健…

Python用MarkovRNN马尔可夫递归神经网络建模序列数据t-SNE可视化研究

原文链接:https://tecdat.cn/?p=37634 原文出处:拓端数据部落公众号 本文聚焦于利用马尔可夫递归神经网络(MarkovRNN)结合树库展开建模工作。MarkovRNN 通过整合马尔可夫特性与离散随机变量来深入探索递归神经网络中的随机转换机制,旨在高效处理具有复杂潜在信息的高度结…

CUDA

1、GPU准备 1、查看GPU类型 GeForce RTX 30602、查看算力https://en.wikipedia.org/wiki/CUDA#GPUs_supported算力8.63、确定CUDA Runtime 支持的CUDA SDK为11.1-12.54、查看驱动的Driver Version CUDA Version 为12.3所以适用的CUDA 11.1-12.3 2、更新显卡驱动 1、下载了最新显…

碳酸锂 短线

大周期:3分钟短线:

【LLM训练系列】从零开始训练大模型之Phi2-mini-Chinese项目解读

一、前言 本文主要是在复现和实践Phi2-mini-Chinese后,简要分析下Phi2-mini-Chinese这个项目,做一个学习实战总结。 原文发布于知乎:https://zhuanlan.zhihu.com/p/718307193,转载请注明出数。 Phi2-mini-Chinese简介 Phi2-Chinese-0.2B 从0开始训练自己的Phi2中文小模型,…

第20篇 window系统安装Redis流程

1.下载 Redis for Windows Redis 官方并没有提供 Windows 版本的安装包,但你可以使用 Microsoft 维护的 Windows 版本的 Redis。你可以从以下链接下载 Redis for Windows:2.安装 Redis 运行安装程序: 双击下载的 .msi 文件,启动安装程序。 按照安装向导的提示进行安装。这里…

C++顺序结构(1)任务

1、下载并观看视频(照着做,多看几遍) https://www.jianguoyun.com/p/DWCNkNEQi8_wDBj5ptYFIAA 2、两项照着做的任务