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

news2024/12/25 0:06:14

宝子们,今天咱来唠唠 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++ 学习节节高!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java基础面试题033】Java泛型的作用是什么?

Java的基础语法可以看尚硅谷的这个PDF&#xff1a;尚硅谷JavaSE基础/《Java从入门到精通(JDK17版)》_尚硅谷电子书.pdf Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com) 回答重点 Java泛型的作用是通过在编译时检查类型安全&#xff0c;允许程序员编写更通用和…

如何永久解决Apache Struts文件上传漏洞

Apache Struts又双叒叕爆文件上传漏洞了。 自Apache Struts框架发布以来&#xff0c;就存在多个版本的漏洞&#xff0c;其中一些漏洞涉及到文件上传功能。这些漏洞可能允许攻击者通过构造特定的请求来绕过安全限制&#xff0c;从而上传恶意文件。虽然每次官方都发布补丁进行修…

重生之我在异世界学编程之C语言:深入动态内存管理收尾 + 柔性数组篇

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文常见的动态内存管理错误&#xf…

重温设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

python使用pip进行库的下载

前言 现如今有太多的python编译软件&#xff0c;其库的下载也是五花八门&#xff0c;但在作者看来&#xff0c;无论是哪种方法都是万变不离其宗&#xff0c;即pip下载。 pip是python的包管理工具&#xff0c;无论你是用的什么python软件&#xff0c;都可以用pip进行库的下载。 …

Apache Solr RCE(CVE-2017-12629)--vulhub

Apache Solr 远程命令执行漏洞&#xff08;CVE-2017-12629&#xff09; Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发&#xff0c;主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个…

apisix转发websocket

1、说明 apisix网关对接websocket&#xff0c;参数以及使用可以看官方文档 WebSocket Authentication | Apache APISIX -- Cloud-Native API Gateway 注意事项&#xff1a; &#xff08;1&#xff09;官方文档是websocket要加认证&#xff0c;但自测发现可以不加认证插件 …

【unity】【游戏开发】Unity项目一运行就蓝屏报Watch Dog Timeout

【背景】 由于是蓝屏所以没法截屏&#xff0c;总之今天遇到了一开Unity&#xff0c;过一阵就蓝屏的情况&#xff0c;报Watch Dog Timeout。 【分析】 通过任务管理器查看&#xff0c;发现Unity占用率100%&#xff0c;再观察Unity内部&#xff0c;每次右下角出现一个Global I…

【unity小技巧】unity最完美的CharacterController 3d角色控制器,实现移动、跳跃、下蹲、奔跑、上下坡、物理碰撞效果,复制粘贴即用(2024/12/12补充)

最终效果 文章目录 最终效果更好的方式&#xff08;2024/12/12补充&#xff09;前言为什么使用CharacterControllerSimpleMove和Move如何选择&#xff1f;1. SimpleMove2. Move 配置CharacterController参数控制相机移动跳跃方式一方式二 下蹲处理下坡抖动问题实现奔跑和不同移…

sentinel学习笔记6-限流降级(上)

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;写的好值得推荐&#xff0c;我整理的有所删减&#xff0c;推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应…

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

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

监控易在汽车制造行业信息化运维中的应用案例

引言 随着汽车制造行业的数字化转型不断深入&#xff0c;信息化类IT软硬件设备的运行状态监控、故障告警、报表报告以及网络运行状态监控等成为了企业运维管理的关键环节。监控易作为一款全面、高效的信息化运维管理工具&#xff0c;在汽车制造行业中发挥着重要作用。本文将结合…

Unity DOTS中的share component

Unity DOTS中的share component 内存管理创建流程修改流程销毁流程Reference share component是DOTS中一类比较特殊的component&#xff0c;顾名思义&#xff0c;它是全局共享的component&#xff0c;所有具有相同component值的entity&#xff0c;共享一个component&#xff0c…

外连接转AntiJoin的应用场景与限制条件 | OceanBase SQL 查询改写系列

在《SQL 改写系列&#xff1a;外连接转内连接的常见场景与错误》一文中&#xff0c;我们了解到谓词条件可以过滤掉连接结果中的 null 情形的&#xff0c;将外连接转化为内连接的做法是可行的&#xff0c;正如图1中路径(a)所示。此时&#xff0c;敏锐的你或许会进一步思考&#…

Facebook的去中心化探索:社交平台的新型发展趋势

随着数字化进程的加速&#xff0c;社交平台的架构正在经历一场深刻的变革。从最初的集中的社交网络到如今去中心化的构想&#xff0c;社交平台正在朝着更加透明、开放和用户主导的方向发展。作为全球最大的社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;也在…

Facebook 与数字社交的未来走向

随着数字技术的飞速发展&#xff0c;社交平台的角色和形式也在不断演变。作为全球最大社交平台之一&#xff0c;Facebook&#xff08;现Meta&#xff09;在推动数字社交的进程中扮演了至关重要的角色。然而&#xff0c;随着互联网的去中心化趋势和新技术的崛起&#xff0c;Face…

LeetCode:222.完全二叉树节点的数量

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;222.完全二叉树节点的数量 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二…

python+opencv+棋盘格实现相机标定及相对位姿估计

pythonopencv棋盘格实现相机标定及相对位姿估计 引言1&#xff0c;使用相机采集含棋盘格图像14张2&#xff0c;进行相机标定&#xff08;1&#xff09;测试软件1标定结果&#xff08;内参及畸变系数&#xff09;&#xff08;2&#xff09;测试软件2标定结果&#xff08;内参及畸…

Vue(四)

1.Vuex 1.1 Vuex是什么 Vuex 是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据。例如&#xff1a;购物车数据、个人信息数据。 1.2 vuex的使用 1.安装 vuex 安装 vuex 与 vue-router 类似&#xff0c;vuex 是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 v…

ShardingSphere-Proxy 连接实战:从 Golang 原生 SQL 到 GORM 的应用

在这篇文章《ShardingSphereProxy:快速入门》中&#xff0c;我们介绍了如何通过 Navicat 连接 ShardingSphere-Proxy。 实际上&#xff0c;ShardingSphere-Proxy 兼容标准的 SQL 和原生数据库协议&#xff0c;因此你可以使用任何 MySQL 客户端与其进行连接&#xff0c;包括 Go…