C++ SQLite轻量化数据库使用总结
- 官网下载:https://www.sqlite.org/download.html


- 示例1
#include <iostream>
#include <sqlite3.h>int main() {sqlite3* db;char* zErrMsg = 0;int rc;// 打开数据库连接(如果数据库不存在,则会自动创建)rc = sqlite3_open("test.db", &db);if (rc) {std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;return(0);} else {std::cout << "Opened database successfully" << std::endl;}// 创建表格const char* sqlCreateTable ="CREATE TABLE STUDENTS(" \"ID INT PRIMARY KEY NOT NULL," \"NAME TEXT NOT NULL," \"AGE INT NOT NULL);";rc = sqlite3_exec(db, sqlCreateTable, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {std::cerr << "SQL error: " << zErrMsg << std::endl;sqlite3_free(zErrMsg);} else {std::cout << "Table created successfully" << std::endl;}// 插入数据const char* sqlInsertData ="INSERT INTO STUDENTS (ID, NAME, AGE) " \"VALUES (1, 'Alice', 20), " \" (2, 'Bob', 22), " \" (3, 'Charlie', 23);";rc = sqlite3_exec(db, sqlInsertData, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {std::cerr << "SQL error: " << zErrMsg << std::endl;sqlite3_free(zErrMsg);} else {std::cout << "Data inserted successfully" << std::endl;}// 查询数据sqlite3_stmt* stmt;const char* sqlSelectData = "SELECT * FROM STUDENTS;";rc = sqlite3_prepare_v2(db, sqlSelectData, -1, &stmt, 0);if (rc != SQLITE_OK) {std::cerr << "Failed to select data: " << sqlite3_errmsg(db) << std::endl;} else {while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {int id = sqlite3_column_int(stmt, 0);const unsigned char* name = sqlite3_column_text(stmt, 1);int age = sqlite3_column_int(stmt, 2);std::cout << "ID: " << id << ", Name: " << name << ", Age: " << age << std::endl;}sqlite3_finalize(stmt);}// 更新数据const char* sqlUpdateData ="UPDATE STUDENTS " \"SET AGE = 24 " \"WHERE ID = 2;";rc = sqlite3_exec(db, sqlUpdateData, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {std::cerr << "SQL error: " << zErrMsg << std::endl;sqlite3_free(zErrMsg);} else {std::cout << "Data updated successfully" << std::endl;}// 再次查询数据以验证更新结果rc = sqlite3_prepare_v2(db, sqlSelectData, -1, &stmt, 0);if (rc != SQLITE_OK) {std::cerr << "Failed to select data after update: " << sqlite3_errmsg(db) << std::endl;} else {while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {int id = sqlite3_column_int(stmt, 0);const unsigned char* name = sqlite3_column_text(stmt, 1);int age = sqlite3_column_int(stmt, 2);std::cout << "ID: " << id << ", Name: " << name << ", Age: " << age << std::endl;}sqlite3_finalize(stmt);}// 关闭数据库连接sqlite3_close(db);return 0;
}
关于内容写入及效率优化
-
文章开始列了一个内容插入与查询的简单例子,下边说一下内容写入提速的几点优化,着重参考https://www.cnblogs.com/rainbowzc/p/6444389.html
- 显示开启事务
- 写同步
- 执行字符串准备
- 高并发模式
-
下边简单示例
#include <iostream>
#include <string>
#include <sstream>
#include <time.h>
#include "sqlite3.h" const int nCount = 500000; int main (int argc,char** argv)
{ sqlite3* db; sqlite3_open("testdb.db" ,&db); sqlite3_exec(db,"PRAGMA synchronous = OFF; ",0,0,0); sqlite3_exec(db,"drop table if exists t1",0,0,0); sqlite3_exec(db,"create table t1(id integer,x integer,y integer ,weight real)",0,0,0); clock_t t1 = clock(); sqlite3_exec(db,"begin;",0,0,0); sqlite3_stmt *stmt; const char* sql = "insert into t1 values(?,?,?,?)"; sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,0); for(int i=0;i<nCount;++i) { // std::stringstream ssm; // ssm<<"insert into t1 values("<<i<<","<<i*2<<","<<i/2<<","<<i*i<<")"; // sqlite3_exec(db,ssm.str().c_str(),0,0,0); sqlite3_reset(stmt); sqlite3_bind_int(stmt,1,i); sqlite3_bind_int(stmt,2,i*2); sqlite3_bind_int(stmt,3,i/2); sqlite3_bind_double(stmt,4,i*i); sqlite3_step(stmt); } sqlite3_finalize(stmt); sqlite3_exec(db,"commit;",0,0,0); clock_t t2 = clock(); sqlite3_close(db); std::cout<<"cost tima: "<<(t2-t1)/1000.<<"s"<<std::endl; return 0;
}
使用关键词查询表格
- 0.打开数据库连接:使用sqlite3_open打开数据库文件test.db。
- 1.创建表格:使用sqlite3_exec执行SQL语句来创建表格。
- 2.插入数据:使用sqlite3_exec执行SQL语句来插入数据。
- 3.准备和执行查询:- 使用sqlite3_prepare_v2准备SQL查询语句。- 使用sqlite3_bind_text绑定查询参数(关键词)。- 使用sqlite3_step执行查询并迭代结果集。- 使用sqlite3_column_int和sqlite3_column_text获取查询结果。
- 4.清理资源:使用sqlite3_finalize释放准备好的语句,使用sqlite3_close关闭数据库连接。
#include <iostream>
#include <sqlite3.h>
#include <string>void check_error(int rc, sqlite3* db) {if (rc) {std::cerr << "SQL error: " << sqlite3_errmsg(db) << std::endl;sqlite3_close(db);exit(rc);}
}int main() {sqlite3* db;char* zErrMsg = 0;int rc;// 打开数据库连接rc = sqlite3_open("test.db", &db);if (rc) {std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;return rc;} else {std::cout << "Opened database successfully" << std::endl;}// 创建表格const char* sql_create_table ="CREATE TABLE IF NOT EXISTS PERSON(""ID INTEGER PRIMARY KEY AUTOINCREMENT,""NAME TEXT NOT NULL,""AGE INTEGER NOT NULL);";rc = sqlite3_exec(db, sql_create_table, 0, 0, &zErrMsg);check_error(rc, db);// 插入数据const char* sql_insert_data ="INSERT INTO PERSON (NAME, AGE) VALUES ('Alice', 30);""INSERT INTO PERSON (NAME, AGE) VALUES ('Bob', 25);""INSERT INTO PERSON (NAME, AGE) VALUES ('Charlie', 35);";rc = sqlite3_exec(db, sql_insert_data, 0, 0, &zErrMsg);check_error(rc, db);// 查询数据std::string keyword = "Alice";const char* sql_query = "SELECT * FROM PERSON WHERE NAME LIKE ?;";sqlite3_stmt* stmt;const char* tail;rc = sqlite3_prepare_v2(db, sql_query, -1, &stmt, &tail);if (rc != SQLITE_OK) {std::cerr << "Failed to prepare statement: " << sqlite3_errmsg(db) << std::endl;sqlite3_close(db);return rc;}// 绑定参数sqlite3_bind_text(stmt, 1, keyword.c_str(), -1, SQLITE_STATIC);// 执行查询while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {int id = sqlite3_column_int(stmt, 0);const unsigned char* name = sqlite3_column_text(stmt, 1);int age = sqlite3_column_int(stmt, 2);std::cout << "ID: " << id << ", Name: " << name << ", Age: " << age << std::endl;}if (rc != SQLITE_DONE) {std::cerr << "Execution failed: " << sqlite3_errmsg(db) << std::endl;}sqlite3_finalize(stmt);sqlite3_close(db);return 0;
}
创建索引
- 创建索引会提高查询速度
#include <iostream>
#include <sqlite3.h>int main() {sqlite3 *db;char *zErrMsg = 0;int rc;// 打开数据库连接rc = sqlite3_open("test.db", &db);if (rc) {std::cerr << "Can't open database: " << sqlite3_errmsg(db) << std::endl;return(0);} else {std::cout << "Opened database successfully" << std::endl;}// 创建表const char *sqlCreateTable = "CREATE TABLE COMPANY(" \"ID INT PRIMARY KEY NOT NULL," \"NAME TEXT NOT NULL," \"AGE INT NOT NULL," \"ADDRESS CHAR(50)," \"SALARY REAL );";rc = sqlite3_exec(db, sqlCreateTable, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {std::cerr << "SQL error: " << zErrMsg << std::endl;sqlite3_free(zErrMsg);} else {std::cout << "Table created successfully" << std::endl;}// 创建索引const char *sqlCreateIndex = "CREATE INDEX idx_name ON COMPANY(NAME);";rc = sqlite3_exec(db, sqlCreateIndex, 0, 0, &zErrMsg);if (rc != SQLITE_OK) {std::cerr << "SQL error: " << zErrMsg << std::endl;sqlite3_free(zErrMsg);} else {std::cout << "Index created successfully" << std::endl;}// 关闭数据库连接sqlite3_close(db);return 0;
}
参考:
1.https://blog.csdn.net/zearot/article/details/51039593
相关文章:
C++ SQLite轻量化数据库使用总结
官网下载:https://www.sqlite.org/download.html 示例1 #include <iostream> #include <sqlite3.h>int main() {sqlite3* db;char* zErrMsg 0;int rc;// 打开数据库连接(如果数据库不存在,则会自动创建)rc sqlite…...
docker打包当前使用的某个容器为镜像,导出,导入
容器打包成镜像 要将正在使用的 Docker 容器打包成镜像,你可以使用 docker commit 命令。这个命令会从运行中的容器创建一个新的镜像。以下是详细步骤: 查看正在运行的容器: 使用以下命令查看当前正在运行的容器: docker ps找到目…...
【刷题22】BFS解决最短路问题
目录 一、边权为1的最短路问题二、迷宫中离入口最近的出口三、最小基因变化四、单词接龙五、为高尔夫比赛砍树 一、边权为1的最短路问题 如图:从A到I,怎样走路径最短 一个队列一个哈希表队列:一层一层递进,直到目的地为止哈希表&…...
服务器重启:数字世界的短暂休憩与新生
在互联网的浩瀚海洋中,服务器犹如一座座灯塔,持续稳定地散发着光芒,为无数的网络活动提供着支撑与指引。而服务器重启,便是这数字灯塔周期性进行自我调整与修复的关键环节。 服务器重启是指对服务器进行重新启动的过程࿰…...
JavaEE 【知识改变命运】05 多线程(4)
文章目录 单例模式什么是单例模式饿汉模式懒汉模式多线程- 懒汉模式分析多线程问题第一种添加sychronized的方式第二种添加sychronized的方式改进第二种添加sychronized的方式(DCL检查锁) 阻塞队列什么是阻塞队列什么是消费生产者模型标准库中的阻塞队列…...
【CSS in Depth 2 精译_076】12.4 @font-face 的工作原理
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体12.3 谷歌字体12.4 font-fac…...
SQL Having用法
拿个业务场景说这个案例,比如我们有个表里面可能有批改过的数据,批改过得数据不会随着新批改的数据覆盖,而是逐条插入表中,如果想找出包含最早批改的数据和最新批改数据的话,那么我们就需要用到了havinng 用法,假设最开…...
@JsonNaming实现入参接口参数下划线驼峰自动转换
JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) 是用于 Jackson 库中的一个注解,作用是改变 Java 对象的字段命名策略,特别是在序列化和反序列化时。这可以帮助 Java 对象中的字段名从驼峰命名法(CamelCase)转换为蛇…...
使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南
目标检测技术作为计算机视觉领域的核心组件,在自动驾驶系统、智能监控、零售分析以及增强现实等应用中发挥着关键作用。本文将详细介绍PaliGemma2模型的微调流程,该模型通过整合SigLIP-So400m视觉编码器与Gemma 2系列的高级语言模型,专门针对…...
MinerU:PDF文档提取工具
目录 docker一键启动本地配置下载模型权重文件demo.pyGPU使用情况 wget https://github.com/opendatalab/MinerU/raw/master/Dockerfile docker build -t mineru:latest .docker一键启动 有点问题,晚点更新 本地配置 就是在Python环境中配置依赖和安装包 根据需求…...
spark的共享变量
因为RDD在spark中是分布式存储 1、python中定义的变量仅仅在driver中运行,在excutor中是获取不到值的——广播变量 2、若定义了一个变量进行累加,先分别在driver和excutor中进行累加,但是结果是不会主动返回给driver的——累加器 Broadcas…...
Scrapy与MongoDB
Scrapy可以在非常短的时间里获取大量的数据。这些数据无论是直接保存为纯文本文件还是CSV文件,都是不可取的。爬取一个小时就可以让这些文件大到无法打开。这个时候,就需要使用数据库来保存数据了。 MongoDB由于其出色的性能,已经成为爬虫的首…...
爬虫基础与实践
爬虫技术基础与实践 在当今数字化的时代,数据成为了宝贵的资源。爬虫技术作为获取数据的重要手段,受到了广泛的关注和应用。本文将介绍爬虫的基本概念、工作原理以及一些常用的技术和工具。 一、爬虫的基本概念 爬虫,也称为网络蜘蛛或网络机器…...
快速上手Serverless架构与FastAPI结合实现自动化移动应用后端
快速上手Serverless架构与FastAPI结合实现自动化移动应用后端 引言 随着云计算技术的发展,Serverless架构已经成为构建现代应用的一种流行选择。它允许开发者将更多精力集中在核心业务逻辑上,而无需管理底层基础设施。本文将以AWS Lambda和API Gateway…...
ansible自动化运维(二)playbook模式详解
一.Ansible中的playbook模式 Playbook不同于使用单个模块操作远程服务器,Playbook的功能更加强大。如果说单个模块执行类似于Linux系统中的命令,那么Playbook就类似于shell脚本,将多个模块组合起来实现一组的操作。 Playbook还是会用到ad-h…...
基于Springboot社团管理系统【附源码】
基于Springboot社团管理系统 效果如下: 系统登录页面 用户管理页面 社团信息管理页面 社团活动管理页面 经费信息管理页面 新闻信息管理页面 系统主页面 社团信息页面 研究背景 在当今高校与社区环境中,学生社团蓬勃发展,成为学生课余生活…...
CSS:html中,.png的动态图,怎么只让它显示部分,比如只显示右上部分的,或右边中间部分
目录 背景 方法 1: 使用 background-image 和 background-position 示例代码 解释 方法 2: 使用 clip-path 裁剪图像 示例代码 解释 方法 3: 使用 object-fit 和 overflow 示例代码 解释 示例 总结 背景 在HTML中,如果你有一个 .png 的动态图(例如一个 GIF 动画或…...
解读CVPR2024-论文分享|RepViT: Revisiting Mobile CNN From ViT Perspective
论文标题 RepViT: Revisiting Mobile CNN From ViT Perspective 论文链接: https://arxiv.org/abs/2307.09283 论文作者 Ao Wang, Hui Chen, Zijia Lin, Jungong Han, Guiguang Ding 内容简介 这篇论文探讨了在资源受限的移动设备上,轻量级视觉变…...
linux部署安装wordpress
一、环境准备 首先我们先介绍下环境和实验中所需要的包 环境: 我使用的是centos7.6的系统 建议关掉selinux和影响到80端口的防火墙策略 selinux永久有效 修改 /etc/selinux/config 文件中的 SELINUX"" 为 disabled ,然后重启。 selinux即…...
[Java] 配置Powershell 的 Maven 环境变量
目录 前言单独为 Powershell 设置 Maven 环境变量 前言 安装使用 maven 的时候发现,明明已经配置好了环境变量。但是在 powershell 中还是无法识别 mvn 命令。原来这货需要另外配置。 单独为 Powershell 设置 Maven 环境变量 要在 PowerShell 中永久配置 Maven 环…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
