当前位置: 首页 > news >正文

sqlite3,一个轻量级的 C++ 数据库库!

宝子们,今天咱来唠唠 sqlite3 这个超棒的轻量级 C++ 数据库库。它就像是一个小巧但功能齐全的“数据仓库”,能帮咱们轻松地存储、查询和管理数据,无论是开发小型的桌面应用,还是做一些简单的数据处理程序,它都能派上大用场,让咱们的程序数据管理变得井井有条。

一、数据库连接与创建

#include <sqlite3.h>
#include <iostream>int main() {// 声明一个数据库连接对象,就像准备打开一扇通往数据仓库的门sqlite3* db;// 尝试打开一个数据库文件,如果不存在就创建一个新的// 这里的 "test.db" 就是我们的数据库文件名,你可以换成自己喜欢的名字int rc = sqlite3_open("test.db", &db);if (rc) {// 如果打开失败,打印出错误信息,就像门打不开,看看是哪里出了问题std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;return 1;} else {std::cout << "数据库打开成功!" << std::endl;}// 关闭数据库连接,就像离开仓库后要关好门sqlite3_close(db);return 0;
}

代码运行结果:如果一切顺利,控制台会输出“数据库打开成功!”,并且在当前目录下会创建一个名为“test.db”的数据库文件(如果之前不存在的话)。如果打开失败,会输出错误信息,比如文件路径不对或者没有权限创建文件等情况。

小贴士:数据库文件名的路径要写对哦,不然就找不到或者创建不了数据库。而且在操作完数据库后,一定要记得关闭连接,就像用完东西要放回原位,不然可能会占用资源,导致程序出现问题。

二、创建表

#include <sqlite3.h>
#include <iostream>int main() {sqlite3* db;// 打开数据库int rc = sqlite3_open("test.db", &db);if (rc) {std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;return 1;}// 创建一个 SQL 语句,用来创建一个名为 "students" 的表// 这个表有 "id"(整数类型,主键,自动递增)、"name"(文本类型)和 "age"(整数类型)三个列const char* create_table_sql = "CREATE TABLE students (""id INTEGER PRIMARY KEY AUTOINCREMENT,""name TEXT,""age INTEGER"");";// 执行 SQL 语句来创建表rc = sqlite3_exec(db, create_table_sql, 0, 0, 0);if (rc!= SQLITE_OK) {// 如果创建表失败,打印出错误信息std::cerr << "创建表失败: " << sqlite3_errmsg(db) << std::endl;sqlite3_close(db);return 1;} else {std::cout << "表创建成功!" << std::endl;}sqlite3_close(db);return 0;
}

代码运行结果:控制台会输出“表创建成功!”,此时在“test.db”数据库中就有了一个名为“students”的空表,准备好存储学生的信息。

小贴士:写 SQL 语句的时候要特别小心语法错误,一个小标点或者关键字写错,表就创建不出来了。可以多检查几遍,或者参考一些 SQL 语法的资料,确保语句正确无误。

三、插入数据

#include <sqlite3.h>
#include <iostream>int main() {sqlite3* db;// 打开数据库int rc = sqlite3_open("test.db", &db);if (rc) {std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;return 1;}// 插入数据的 SQL 语句,往 "students" 表里插入一条学生信息const char* insert_sql = "INSERT INTO students (name, age) VALUES ('小明', 18);";rc = sqlite3_exec(db, insert_sql, 0, 0, 0);if (rc!= SQLITE_OK) {// 如果插入数据失败,打印出错误信息std::cerr << "插入数据失败: " << sqlite3_errmsg(db) << std::endl;sqlite3_close(db);return 1;} else {std::cout << "数据插入成功!" << std::endl;}sqlite3_close(db);return 0;
}

代码运行结果:控制台会输出“数据插入成功!”,这样就在“students”表中插入了一条名为“小明”,年龄为 18 岁的学生记录。

小贴士:插入的数据值要和表的列类型匹配哦,不然也会出错。比如这里的名字要用单引号括起来,因为它是文本类型,年龄是整数类型就直接写数字。

四、查询数据

#include <sqlite3.h>
#include <iostream>int callback(void* data, int argc, char** argv, char** azColName) {// 这个回调函数用来处理查询结果,会逐行打印出每列的名称和值for (int i = 0; i < argc; ++i) {std::cout << azColName[i] << " = " << argv[i] << std::endl;}std::cout << "-----------------" << std::endl;return 0;
}int main() {sqlite3* db;// 打开数据库int rc = sqlite3_open("test.db", &db);if (rc) {std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;return 1;}// 查询数据的 SQL 语句,从 "students" 表中查询所有记录const char* select_sql = "SELECT * FROM students;";rc = sqlite3_exec(db, select_sql, callback, 0, 0);if (rc!= SQLITE_OK) {// 如果查询失败,打印出错误信息std::cerr << "查询数据失败: " << sqlite3_errmsg(db) << std::endl;sqlite3_close(db);return 1;}sqlite3_close(db);return 0;
}

代码运行结果:如果之前成功插入了数据,控制台会输出:

id = 1
name = 小明
age = 18
-----------------

这里的“1”是自动递增的主键值。如果表中还有其他数据,也会逐行输出。

小贴士:回调函数的参数要理解清楚哦,argc 是列的数量,argv 是每列的值,azColName 是每列的名称。通过这个回调函数,我们可以灵活地处理查询到的数据,比如把它存储到一个数组或者结构体中,方便后续的使用。

五、实际应用场景

假如我们要开发一个小型的图书管理系统,就可以用 sqlite3 来存储图书的信息,像书名、作者、出版社、出版日期、库存数量等。通过创建相应的表,插入图书的记录,然后在需要查询图书信息、统计库存、办理借阅和归还手续等操作时,使用 sqlite3 的查询和更新语句来实现。这样一个简单的数据库就能让整个图书管理系统的数据管理变得有序且高效,方便管理员和读者的使用。

再比如,做一个简单的记账软件,用 sqlite3 存储每笔收支的金额、日期、分类、备注等信息。通过查询和统计功能,可以方便地查看每月的收支情况、各类支出的占比等,帮助用户更好地管理自己的财务状况。

六、实践练习

  1. 在“students”表中再插入两条不同的学生记录,然后查询出所有年龄大于 18 岁的学生信息。

  2. 给“students”表添加一个“score”列(浮点数类型),用来存储学生的成绩,然后更新之前插入的学生记录的成绩值,最后查询出所有学生的信息,包括成绩。

宝子们,sqlite3 的功能远不止这些,还有很多高级的用法和技巧等着大家去探索。多动手敲敲代码,尝试不同的操作,才能真正掌握它哦。

今天的 C++ 学习之旅就到这里啦!记得动手敲代码。祝大家学习愉快,C++ 学习节节高!

相关文章:

sqlite3,一个轻量级的 C++ 数据库库!

宝子们&#xff0c;今天咱来唠唠 sqlite3 这个超棒的轻量级 C 数据库库。它就像是一个小巧但功能齐全的“数据仓库”&#xff0c;能帮咱们轻松地存储、查询和管理数据&#xff0c;无论是开发小型的桌面应用&#xff0c;还是做一些简单的数据处理程序&#xff0c;它都能派上大用…...

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类 CIFAR10数据集ParNet架构特点优势应用 ParNet结构代码详解结构代码代码详解SSEParNetBlock 类DownsamplingBlock 类FusionBlock 类ParNet 类 训练过程和测试结果代码汇总parnet.pytrain.pytest.py 前面文章我们构…...

验证 Dijkstra 算法程序输出的奥秘

一、引言 Dijkstra 算法作为解决图中单源最短路径问题的经典算法,在网络路由、交通规划、资源分配等众多领域有着广泛应用。其通过不断选择距离源节点最近的未访问节点,逐步更新邻居节点的最短路径信息,以求得从源节点到其他所有节点的最短路径。在实际应用中,确保 Dijkst…...

二叉树的最小深度

最小深度思路解析: 与求最大深度相比,求最小深度就要简单很多,从上向下访问,只要访问到一个叶节点,证明已经到达了与根节点距离最近的叶节点处,此叶节点的深度即为最小深度.借助队列,如果当前节点为叶节点,则返回该节点的深度为最终结果;如果当前节点不满足上述判断且不为空节…...

C#+OpenCv深度学习开发(常用模型汇总)

在使用 OpenCvSharp 结合深度学习进行机器视觉开发时&#xff0c;有许多现成的模型可以使用。以下是一些常用的深度学习模型&#xff0c;适用于不同的机器视觉任务&#xff0c;包括物体检测、图像分类和分割等。 使用示例 在 OpenCvSharp 中加载和使用这些模型的基本示例&…...

什么样的LabVIEW控制算自动控制?

自动控制是指系统通过预先设计的算法和逻辑&#xff0c;在无人工干预的情况下对被控对象的状态进行实时监测、决策和调整&#xff0c;达到预期目标的过程。LabVIEW作为一种图形化编程工具&#xff0c;非常适合开发自动控制系统。那么&#xff0c;什么样的LabVIEW控制算作“自动…...

Linux系统编程——理解系统内核中的信号捕获

目录 一、sigaction() 使用 信号捕捉技巧 二、可重入函数 三、volatile关键字 四、SIGCHLD信号 在信号这一篇中我们已经学习到了一种信号捕捉的调用接口&#xff1a;signal(),为了深入理解操作系统内核中的信号捕获机制&#xff0c;我们今天再来看一个接口&#xff1a;si…...

《Java 与 OpenAI 协同:开启智能编程新范式》

在当今科技飞速发展的时代&#xff0c;人工智能已成为推动各领域创新变革的核心力量。OpenAI 作为人工智能领域的领军者&#xff0c;其开发的一系列强大模型&#xff0c;如 GPT 系列&#xff0c;为自然语言处理等诸多任务带来了前所未有的突破。而 Java&#xff0c;作为一种广泛…...

基于Python大数据的电影可视化分析系统

标题:基于 Python 大数据的电影可视化分析系统 内容:1.摘要 本文介绍了一个基于 Python 大数据的电影可视化分析系统。该系统通过收集和分析大量电影数据&#xff0c;提供了对电影市场的深入洞察。文章首先介绍了系统的背景和目的&#xff0c;然后详细描述了系统的架构和功能。…...

【杂谈】-为什么Python是AI的首选语言

为什么Python是AI的首选语言 文章目录 为什么Python是AI的首选语言1、为何 Python 引领人工智能发展1.1 可用性和生态系统1.2 用户群和用例1.3 效率辅助 2、AI项目对Python开发人员的要求3、如何开启你的 AI 学习之旅 人工智能的广泛应用正在软件工程领域引发范式转变。Python凭…...

(高可用版本)Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群

KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集群 一.环境准备&#xff0c;二.容器运行时Containerd安装请参照前文。KubeadmContainerd部署k8s(v1.28.2)集群&#xff08;非高可用版&#xff09;-CSDN博客 文章目录 KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集…...

单片机:实现自动关机电路(附带源码)

单片机实现自动关机电路 在许多嵌入式系统或便携式设备中&#xff0c;自动关机功能非常重要&#xff0c;尤其是在电池供电的设备中&#xff0c;防止设备长时间开启以节省电能。自动关机电路的基本功能是检测设备是否处于待机状态&#xff0c;若一定时间内未收到用户操作信号或…...

【YashanDB知识库】ycm-YashanDB列表有数据库显示故障排除步骤

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7802959.html?templateId1718516 数据库状态 正常 异常 1、查看告警列表 例如&#xff1a;告警显示实例无法连接&#xff0c;一般是数据库实例服务掉了&#xff0c;需要尽快联系系统…...

高级的SQL查询技巧有哪些?

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///C爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于高级SQL查询技巧方面的相关内容&#xf…...

使用 UniApp 在微信小程序中实现 SSE 流式响应

概述 服务端发送事件&#xff08;Server-Sent Events, SSE&#xff09;是一种允许服务器向客户端推送实时更新的技术。SSE 提供了一种单向的通信通道&#xff0c;服务器可以持续地向客户端发送数据&#xff0c;而不需要客户端频繁发起请求。这对于需要实时更新的应用场景非常有…...

transformer用作分类任务

系列博客目录 文章目录 系列博客目录1、在手写数字图像这个数据集上进行分类1. 数据准备2. 将图像转化为适合Transformer的输入3. 位置编码4. Transformer编码器5. 池化操作6. 分类头7. 训练8. 评估总结流程&#xff1a;相关模型&#xff1a; 1、在手写数字图像这个数据集上进行…...

【枚举】假币问题

题目描述&#xff1a; 有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同&#xff0c;但不知道假币比真币轻还是重。现在&#xff0c;用一架天平称了这些币三次&#xff0c;告诉你称的结果&#xff0c;请你找出假币并且确定假币是轻是重&#xff08;数据保证一定能找出…...

easyExcel导出大数据量EXCEL文件,前端实现进度条或者遮罩层

需求&#xff1a;页面点击导出&#xff0c;先按照页面条件去数据库查询&#xff0c;然后将查询到的数据导出。 问题&#xff1a;由于查询特别耗时&#xff0c;所以点击之后页面会看上去没有反应 方案1&#xff1a;就在点击之后在页面增加了一个进度条&#xff0c;等待后端查询…...

Java模拟Mqtt客户端连接Mqtt Broker

Java模拟Mqtt客户端基本流程 引入Paho MQTT客户端库 <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.mqttv5.client</artifactId><version>1.2.5</version> </dependency>设置mqtt配置数据 …...

【电商搜索】文档的信息论生成聚类

【电商搜索】文档的信息论生成聚类 目录 文章目录 【电商搜索】文档的信息论生成聚类目录文章信息概览研究背景技术挑战如何破局技术应用主要相关工作与参考文献后续优化方向 后记 文章信息 https://arxiv.org/pdf/2412.13534 概览 本文提出了一种基于信息论的生成聚类&#…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...