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

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轻量化数据库使用总结

官网下载&#xff1a;https://www.sqlite.org/download.html 示例1 #include <iostream> #include <sqlite3.h>int main() {sqlite3* db;char* zErrMsg 0;int rc;// 打开数据库连接&#xff08;如果数据库不存在&#xff0c;则会自动创建&#xff09;rc sqlite…...

docker打包当前使用的某个容器为镜像,导出,导入

容器打包成镜像 要将正在使用的 Docker 容器打包成镜像&#xff0c;你可以使用 docker commit 命令。这个命令会从运行中的容器创建一个新的镜像。以下是详细步骤&#xff1a; 查看正在运行的容器&#xff1a; 使用以下命令查看当前正在运行的容器&#xff1a; docker ps找到目…...

【刷题22】BFS解决最短路问题

目录 一、边权为1的最短路问题二、迷宫中离入口最近的出口三、最小基因变化四、单词接龙五、为高尔夫比赛砍树 一、边权为1的最短路问题 如图&#xff1a;从A到I&#xff0c;怎样走路径最短 一个队列一个哈希表队列&#xff1a;一层一层递进&#xff0c;直到目的地为止哈希表&…...

服务器重启:数字世界的短暂休憩与新生

在互联网的浩瀚海洋中&#xff0c;服务器犹如一座座灯塔&#xff0c;持续稳定地散发着光芒&#xff0c;为无数的网络活动提供着支撑与指引。而服务器重启&#xff0c;便是这数字灯塔周期性进行自我调整与修复的关键环节。 服务器重启是指对服务器进行重新启动的过程&#xff0…...

JavaEE 【知识改变命运】05 多线程(4)

文章目录 单例模式什么是单例模式饿汉模式懒汉模式多线程- 懒汉模式分析多线程问题第一种添加sychronized的方式第二种添加sychronized的方式改进第二种添加sychronized的方式&#xff08;DCL检查锁&#xff09; 阻塞队列什么是阻塞队列什么是消费生产者模型标准库中的阻塞队列…...

【CSS in Depth 2 精译_076】12.4 @font-face 的工作原理

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 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用法

拿个业务场景说这个案例&#xff0c;比如我们有个表里面可能有批改过的数据&#xff0c;批改过得数据不会随着新批改的数据覆盖&#xff0c;而是逐条插入表中&#xff0c;如果想找出包含最早批改的数据和最新批改数据的话&#xff0c;那么我们就需要用到了havinng 用法,假设最开…...

@JsonNaming实现入参接口参数下划线驼峰自动转换

JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) 是用于 Jackson 库中的一个注解&#xff0c;作用是改变 Java 对象的字段命名策略&#xff0c;特别是在序列化和反序列化时。这可以帮助 Java 对象中的字段名从驼峰命名法&#xff08;CamelCase&#xff09;转换为蛇…...

使用PaliGemma2构建多模态目标检测系统:从架构设计到性能优化的技术实践指南

目标检测技术作为计算机视觉领域的核心组件&#xff0c;在自动驾驶系统、智能监控、零售分析以及增强现实等应用中发挥着关键作用。本文将详细介绍PaliGemma2模型的微调流程&#xff0c;该模型通过整合SigLIP-So400m视觉编码器与Gemma 2系列的高级语言模型&#xff0c;专门针对…...

MinerU:PDF文档提取工具

目录 docker一键启动本地配置下载模型权重文件demo.pyGPU使用情况 wget https://github.com/opendatalab/MinerU/raw/master/Dockerfile docker build -t mineru:latest .docker一键启动 有点问题&#xff0c;晚点更新 本地配置 就是在Python环境中配置依赖和安装包 根据需求…...

spark的共享变量

因为RDD在spark中是分布式存储 1、python中定义的变量仅仅在driver中运行&#xff0c;在excutor中是获取不到值的——广播变量 2、若定义了一个变量进行累加&#xff0c;先分别在driver和excutor中进行累加&#xff0c;但是结果是不会主动返回给driver的——累加器 Broadcas…...

Scrapy与MongoDB

Scrapy可以在非常短的时间里获取大量的数据。这些数据无论是直接保存为纯文本文件还是CSV文件&#xff0c;都是不可取的。爬取一个小时就可以让这些文件大到无法打开。这个时候&#xff0c;就需要使用数据库来保存数据了。 MongoDB由于其出色的性能&#xff0c;已经成为爬虫的首…...

爬虫基础与实践

爬虫技术基础与实践 在当今数字化的时代&#xff0c;数据成为了宝贵的资源。爬虫技术作为获取数据的重要手段&#xff0c;受到了广泛的关注和应用。本文将介绍爬虫的基本概念、工作原理以及一些常用的技术和工具。 一、爬虫的基本概念 爬虫&#xff0c;也称为网络蜘蛛或网络机器…...

快速上手Serverless架构与FastAPI结合实现自动化移动应用后端

快速上手Serverless架构与FastAPI结合实现自动化移动应用后端 引言 随着云计算技术的发展&#xff0c;Serverless架构已经成为构建现代应用的一种流行选择。它允许开发者将更多精力集中在核心业务逻辑上&#xff0c;而无需管理底层基础设施。本文将以AWS Lambda和API Gateway…...

ansible自动化运维(二)playbook模式详解

一.Ansible中的playbook模式 Playbook不同于使用单个模块操作远程服务器&#xff0c;Playbook的功能更加强大。如果说单个模块执行类似于Linux系统中的命令&#xff0c;那么Playbook就类似于shell脚本&#xff0c;将多个模块组合起来实现一组的操作。 Playbook还是会用到ad-h…...

基于Springboot社团管理系统【附源码】

基于Springboot社团管理系统 效果如下&#xff1a; 系统登录页面 用户管理页面 社团信息管理页面 社团活动管理页面 经费信息管理页面 新闻信息管理页面 系统主页面 社团信息页面 研究背景 在当今高校与社区环境中&#xff0c;学生社团蓬勃发展&#xff0c;成为学生课余生活…...

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 论文链接&#xff1a; https://arxiv.org/abs/2307.09283 论文作者 Ao Wang, Hui Chen, Zijia Lin, Jungong Han, Guiguang Ding 内容简介 这篇论文探讨了在资源受限的移动设备上&#xff0c;轻量级视觉变…...

linux部署安装wordpress

一、环境准备 首先我们先介绍下环境和实验中所需要的包 环境&#xff1a; 我使用的是centos7.6的系统 建议关掉selinux和影响到80端口的防火墙策略 selinux永久有效 修改 /etc/selinux/config 文件中的 SELINUX"" 为 disabled &#xff0c;然后重启。 selinux即…...

[Java] 配置Powershell 的 Maven 环境变量

目录 前言单独为 Powershell 设置 Maven 环境变量 前言 安装使用 maven 的时候发现&#xff0c;明明已经配置好了环境变量。但是在 powershell 中还是无法识别 mvn 命令。原来这货需要另外配置。 单独为 Powershell 设置 Maven 环境变量 要在 PowerShell 中永久配置 Maven 环…...

Android -- [SelfView] 自定义弹窗式颜色选择器

Android – [SelfView] 自定义弹窗式颜色选择器 PS: 1. 弹框式显示&#xff1b; 2. 支持透明度设置&#xff1b; 3. 支持拖动控件选择颜色&#xff1b; 4. 支持 ARGB | HEX 数值填写预览颜色并返回&#xff1b; 5. 输出支持Hex 和 Int 两种格式&#xff1b;效果 使用方法&…...

vue-echarts高度缩小时autoresize失效

背景 项目中采用动态给x-vue-echarts style赋值width&#xff0c;height的方式实现echarts图表尺寸的改变 <v-chart...autoresize></v-chart>给v-chart添加autoresize后&#xff0c;在图表宽度变化&#xff0c;高度增加时无异常&#xff0c;高度减小时图表并未缩…...

rabbitMq的rabbitmqctl status报错

Error: unable to perform an operation on node rabbitASUS-PC. Please see diagnostics information and suggestions below. 遇到上图这个错大部分问题可能是由于 RabbitMQ CLI 工具的 Erlang Cookie 与服务器上的不匹配而导致连接问题。Erlang Cookie 在 RabbitMQ 节点之间…...

linux c++ uuid编译时的问题

linux c uuid编译时的问题 写在前面可能编译过和不能编译过的可以编译和link过的不能编译过的 写在前面 几次翻车与uuid相关&#xff0c;超出我认知。 所以&#xff0c;把一些遇到的相关问题写在这里。 可能编译过和不能编译过的 可以编译和link过的 cmake_minimum_require…...

【STM32】RTT-Studio中HAL库开发教程九:FLASH中的OPT

文章目录 一、概要二、内部FLASH排布三、内部FLASH主要特色四、OTP函数介绍五、测试验证 一、概要 STM32系列是一款强大而灵活的微控制器&#xff0c;它的片内Flash存储器可以用来存储有关代码和数据&#xff0c;在实际应用中&#xff0c;我们也需要对这个存储器进行读写操作。…...

[SWPUCTF 2021 新生赛]crypto9

[MoeCTF 2021]Web安全入门指北—GET 意思是GET传参&#xff0c;moeflag 就可以得到falg 输入?moeflag flag为&#xff1a; NSSCTF{ff26110b-8793-403c-990e-15c7f1820596} [SWPUCTF 2021 新生赛]crypto9 #gpt写的代码 from itertools import product letter_list ABCDEFG…...

vue中常用的指令

v - if 指令 功能详细解释 它是一种真正的条件渲染指令。在 Vue 实例初始化以及数据更新过程中&#xff0c;Vue.js 会对v - if指令中的表达式进行求值。这个表达式可以是简单的布尔变量&#xff0c;也可以是一个复杂的计算表达式&#xff0c;只要最终结果是布尔值就行。当表达式…...

Docker Compose实战三:轻松部署PHP

通过前面的文章&#xff08;Docker Compose基础语法与MySQL部署&#xff09;&#xff0c;你已经掌握了Docker Compose的基本语法和常用指令&#xff0c;并成功部署了一个MySQL数据库服务器。今天&#xff0c;我们将继续深入探索Docker Compose的强大功能&#xff0c;介绍如何使…...

数据分析实战—房价特征关系

1.实战内容 &#xff08;1&#xff09; 读取房价特征关系表&#xff08;house_price.npz&#xff09;绘制离地铁站的距离与单位面积的房价的散点图&#xff0c;并对其进行分析&#xff1b; import pandas as pd import numpy as np import warnings warnings.filterwarnings(&…...

云和恩墨 zCloud 与华为云 GaussDB 完成兼容性互认证

近日&#xff0c;云和恩墨&#xff08;北京&#xff09;信息技术有限公司&#xff08;以下简称&#xff1a;云和恩墨&#xff09;的多元数据库智能管理平台 zCloud 与华为云计算技术有限公司&#xff08;以下简称&#xff1a;华为云&#xff09;的 GaussDB 数据库完成了兼容性互…...

海珠营销型网站建设/免费推广渠道有哪些

前两天刚刚装了一个MyEclipse&#xff0c;今天用了一下&#xff0c;却发现&#xff0c;每次想要在控制台上输出中文时&#xff0c;总是以乱码显示的。查了很多资料&#xff0c;对算是搞明白&#xff0c;怎么回事。首先&#xff0c;在这里先解释下&#xff0c;MyEclipse&#xf…...

网页制作 公司网站/搜索app下载安装

1、序列的方法 python中序列包含列表list、元组tuple、字符串str。 可以用于序列&#xff08;表、元组、字符串&#xff09;的内建函数&#xff1a; len(s) 返回&#xff1a; 序列中包含元素的个数min(s) 返回&#xff1a; 序列中最小的元素max(s) 返回&#xff1a; 序列中…...

嘉兴高端网站建设/百度推广登录平台

在上一文中&#xff0c;论述两个.Net Framework对null应用不够合理的例子。大家评论中&#xff0c;给出了不少指导性意见&#xff0c;这里也对.Net中null的使用规范作一下总结。 1. Empty代表瓶子是空的&#xff0c;null代表瓶子都没有 首先要明确你的“瓶子”是什么&#xff0…...

用什么系统做威客网站/网络推广员具体做什么的

ps&#xff1a;对go 不太熟悉&#xff0c;只因利用docker镜像golang 编译时报错&#xff0c;所以记录下 dockerfile FROM golang WORKDIR /go/src/app ADD . /go/src/app RUN go get -u -v github.com/kardianos/govendor ##安装govendor&#xff0c;govendor用来管理项目的…...

做图用哪个素材网站/黄山搜索引擎优化

源&#xff1a;http://blog.csdn.net/mentat/archive/2008/12/16/3528160.aspx 人生的最大悲剧&#xff0c;就是孜孜不倦的努力却终于失败&#xff01; 美国一位学者曾经分析了数千人的经历&#xff0c;结果是总人数的98%都是失败者。并由此归纳了人们失败的主要原因&#xff…...

东营网站建设优化/google中文搜索引擎

前言今天跟大家分享下SpringBoot 常见高频面试题的知识。下面是小编关于SpringBoot的知识点总结了一个思维导图&#xff0c;希望对大家所有帮助&#xff01;话不多说&#xff0c;下面我们开始正题&#xff1a;1. 什么是SpringBoot?通过Spring Boot&#xff0c;可以轻松地创建独…...