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 存储每笔收支的金额、日期、分类、备注等信息。通过查询和统计功能,可以方便地查看每月的收支情况、各类支出的占比等,帮助用户更好地管理自己的财务状况。
六、实践练习
在“students”表中再插入两条不同的学生记录,然后查询出所有年龄大于 18 岁的学生信息。
给“students”表添加一个“score”列(浮点数类型),用来存储学生的成绩,然后更新之前插入的学生记录的成绩值,最后查询出所有学生的信息,包括成绩。
宝子们,sqlite3 的功能远不止这些,还有很多高级的用法和技巧等着大家去探索。多动手敲敲代码,尝试不同的操作,才能真正掌握它哦。
今天的 C++ 学习之旅就到这里啦!记得动手敲代码。祝大家学习愉快,C++ 学习节节高!
相关文章:
sqlite3,一个轻量级的 C++ 数据库库!
宝子们,今天咱来唠唠 sqlite3 这个超棒的轻量级 C 数据库库。它就像是一个小巧但功能齐全的“数据仓库”,能帮咱们轻松地存储、查询和管理数据,无论是开发小型的桌面应用,还是做一些简单的数据处理程序,它都能派上大用…...
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 结合深度学习进行机器视觉开发时,有许多现成的模型可以使用。以下是一些常用的深度学习模型,适用于不同的机器视觉任务,包括物体检测、图像分类和分割等。 使用示例 在 OpenCvSharp 中加载和使用这些模型的基本示例&…...
什么样的LabVIEW控制算自动控制?
自动控制是指系统通过预先设计的算法和逻辑,在无人工干预的情况下对被控对象的状态进行实时监测、决策和调整,达到预期目标的过程。LabVIEW作为一种图形化编程工具,非常适合开发自动控制系统。那么,什么样的LabVIEW控制算作“自动…...
Linux系统编程——理解系统内核中的信号捕获
目录 一、sigaction() 使用 信号捕捉技巧 二、可重入函数 三、volatile关键字 四、SIGCHLD信号 在信号这一篇中我们已经学习到了一种信号捕捉的调用接口:signal(),为了深入理解操作系统内核中的信号捕获机制,我们今天再来看一个接口:si…...
《Java 与 OpenAI 协同:开启智能编程新范式》
在当今科技飞速发展的时代,人工智能已成为推动各领域创新变革的核心力量。OpenAI 作为人工智能领域的领军者,其开发的一系列强大模型,如 GPT 系列,为自然语言处理等诸多任务带来了前所未有的突破。而 Java,作为一种广泛…...
基于Python大数据的电影可视化分析系统
标题:基于 Python 大数据的电影可视化分析系统 内容:1.摘要 本文介绍了一个基于 Python 大数据的电影可视化分析系统。该系统通过收集和分析大量电影数据,提供了对电影市场的深入洞察。文章首先介绍了系统的背景和目的,然后详细描述了系统的架构和功能。…...
【杂谈】-为什么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)集群 一.环境准备,二.容器运行时Containerd安装请参照前文。KubeadmContainerd部署k8s(v1.28.2)集群(非高可用版)-CSDN博客 文章目录 KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集…...
单片机:实现自动关机电路(附带源码)
单片机实现自动关机电路 在许多嵌入式系统或便携式设备中,自动关机功能非常重要,尤其是在电池供电的设备中,防止设备长时间开启以节省电能。自动关机电路的基本功能是检测设备是否处于待机状态,若一定时间内未收到用户操作信号或…...
【YashanDB知识库】ycm-YashanDB列表有数据库显示故障排除步骤
本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7802959.html?templateId1718516 数据库状态 正常 异常 1、查看告警列表 例如:告警显示实例无法连接,一般是数据库实例服务掉了,需要尽快联系系统…...
高级的SQL查询技巧有哪些?
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于高级SQL查询技巧方面的相关内容…...
使用 UniApp 在微信小程序中实现 SSE 流式响应
概述 服务端发送事件(Server-Sent Events, SSE)是一种允许服务器向客户端推送实时更新的技术。SSE 提供了一种单向的通信通道,服务器可以持续地向客户端发送数据,而不需要客户端频繁发起请求。这对于需要实时更新的应用场景非常有…...
transformer用作分类任务
系列博客目录 文章目录 系列博客目录1、在手写数字图像这个数据集上进行分类1. 数据准备2. 将图像转化为适合Transformer的输入3. 位置编码4. Transformer编码器5. 池化操作6. 分类头7. 训练8. 评估总结流程:相关模型: 1、在手写数字图像这个数据集上进行…...
【枚举】假币问题
题目描述: 有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出…...
easyExcel导出大数据量EXCEL文件,前端实现进度条或者遮罩层
需求:页面点击导出,先按照页面条件去数据库查询,然后将查询到的数据导出。 问题:由于查询特别耗时,所以点击之后页面会看上去没有反应 方案1:就在点击之后在页面增加了一个进度条,等待后端查询…...
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 概览 本文提出了一种基于信息论的生成聚类&#…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
