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

RabbitMQ的学习和模拟实现|sqlite轻量级数据库的介绍和简单使用

SQLite3

项目仓库:https://github.com/ffengc/HareMQ

  • SQLite3
    • 什么是SQLite
    • 为什么需要用SQLite
    • 官方文档
    • 封装Helper
    • 进行一些实验

什么是SQLite

SQLite是一个进程内的轻量级数据库,它实现了自给自足的、无服务器的、零配置的、事务性的 SQL数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,我们不需要在系统中配置。像其他数据库,SQLite引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接,SQLite直接访问其存储文件。

为什么需要用SQLite

[!NOTE]

  • 不需要一个单独的服务器进程或操作的系统(无服务器的)。
  • SQLite不需要配置。
  • 一个完整的SQLite数据库是存储在一个单一的跨平台的磁盘文件。
  • SQLite是非常小的,是轻量级的,完全配置时小于400KiB,省略可选功能配置时小于250KiB, SQLite是自给自足的,这意味着不需要任何外部的依赖。
  • SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
  • SQLite支持SQL92(SQL2)标准的大多数查询语言的功能。
  • SQLite使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
  • SQLite可在UNlX(Linux, MacOs-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。

官方文档

  • https://www.sqlite.org/c3ref/funclist.html

封装Helper

因为不是所有的功能我们都会用到,因此我们先封装一些常用的方法到一个.hpp文件里面,方便后续使用即可。

/*** 封装sqlite常用方法*/#ifndef __YUFC_SQLITE_HELPER__
#define __YUFC_SQLITE_HELPER__#include "../log.hpp"
#include <iostream>
#include <sqlite3.h>
#include <string>class sqlite_helper {
public:typedef int (*sqlite_callback)(void*, int, char**, char**);private:sqlite3* __handler;std::string __db_file;public:sqlite_helper(const std::string& db_file): __db_file(db_file), __handler(nullptr) { }bool open(int safe_lavel = SQLITE_OPEN_FULLMUTEX) {// 打开数据库(文件)// int sqlite3_open_v2(const char* filename, sqlite3 **ppDb, int flags, const char* zVfs);int ret = sqlite3_open_v2(__db_file.c_str(), &__handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_lavel, nullptr);if (ret != SQLITE_OK) {LOG(ERROR) << "create database failed: " << sqlite3_errmsg(__handler) << std::endl;return false;}return true;}bool exec(const std::string& sql, sqlite_callback& cb, void* arg) {// 执行语句// int sqlite3_exec(sqlite3*, char* sql, int (*callback)(void*, int, char**, char**), void* arg, char**err);int ret = sqlite3_exec(__handler, sql.c_str(), cb, arg, nullptr);if (ret != SQLITE_OK) {LOG(ERROR) << "run exec: [" << sql << "] failed: " << sqlite3_errmsg(__handler) << std::endl;return false;}return true;}bool close() {// 关闭数据库(文件)if (__handler) {if (sqlite3_close_v2(__handler))return true;LOG(ERROR) << "close error" << std::endl;return false;}LOG(ERROR) << "null sql handler" << std::endl;return false;}
};#endif

进行一些实验

插入一些数据试试:

int main() {// 1. 创建/打开库文件sqlite_helper helper("./test.db");assert(helper.open());// 2. 创建表(不存在则创建)const char* create_sql = "create table if not exists student(sn int primary key, name varchar(32), age int);";assert(helper.exec(create_sql, nullptr, nullptr));// 3. 新增数据(增删查改)const char* insert_sql = "insert into student values(1, 'Sam', 18), (2, 'Jack', 19), (3, 'Lucy', 18);";assert(helper.exec(insert_sql, nullptr, nullptr));// 4. 关闭数据库helper.close();return 0;
}

运行之后就会有一个 test.db 的数据库文件

sqlite3 test.db # 打开数据库

就可以看到我们的数据了:

测试查询:

int select_cb(void* arg, int col_count, char** result, char** fields_name) {std::vector<std::string>* arr = (std::vector<std::string>*)arg; // 拿到传进来的数组arr->push_back(result[0]); // 因为查询结果只有一个字段,所以push一个就行了return 0; // 这里一定要返回0表示正常,否则可能会触发abort
}int main() {// 1. 创建/打开库文件sqlite_helper helper("./test.db");assert(helper.open());// 2. 创建表(不存在则创建)const char* create_sql = "create table if not exists student(sn int primary key, name varchar(32), age int);";assert(helper.exec(create_sql, nullptr, nullptr));// 3. 新增数据(增删查改)const char* insert_sql = "insert into student values(1, 'Sam', 18), (2, 'Jack', 19), (3, 'Lucy', 18);";assert(helper.exec(insert_sql, nullptr, nullptr));const char* select_sql = "select name from student;";std::vector<std::string> arr;assert(helper.exec(select_sql, select_cb, &arr));for (const auto& name : arr)std::cout << name << " ";std::cout << std::endl;// 4. 关闭数据库helper.close();return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Zabbix监控系统:zabbix服务部署+基于Proxy分布式部署+zabbix主动与被动监控模式
  • 在Linux、Windows和macOS上释放IP地址并重新获取新IP地址的方法
  • 探索Mojo模型的超参数优化:自定义搜索策略全解析
  • Anaconda下安装配置Jupyter
  • 如何给7Z分卷文件设置密码?简单几步给文件加上安全锁
  • Python 全栈体系【三阶】(三)
  • 道可云元宇宙每日资讯|国家数据局:积极探索区块链创新应用
  • 站在资本投资领域如何看待分布式光纤传感行业?
  • 运行 npm install 报错-4048
  • 大模型学习笔记十三:工作流
  • Win10专业版系统Docker安装、配置和使用详细教程
  • SpringCloud 环境工程搭建
  • AI 驱动下的一体化分布式数据库:滴滴、快手、中国恩菲、好未来、翼鸥教育共话创新应用实践|OceanBase Meetup 精彩回顾
  • Redis 持久化详解
  • ubuntu安装mysql8.0
  • @jsonView过滤属性
  • 2019.2.20 c++ 知识梳理
  • canvas绘制圆角头像
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Less 日常用法
  • Web Storage相关
  • 分布式任务队列Celery
  • 前端相关框架总和
  • 使用agvtool更改app version/build
  • 数据结构java版之冒泡排序及优化
  • 阿里云ACE认证之理解CDN技术
  • 第二十章:异步和文件I/O.(二十三)
  • ​香农与信息论三大定律
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #pragma 指令
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (~_~)
  • (06)Hive——正则表达式
  • (33)STM32——485实验笔记
  • (a /b)*c的值
  • (C++17) optional的使用
  • (k8s)Kubernetes本地存储接入
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (过滤器)Filter和(监听器)listener
  • (九)c52学习之旅-定时器
  • (算法)硬币问题
  • (五)关系数据库标准语言SQL
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)Linux整合apache和tomcat构建Web服务器
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .netcore 获取appsettings
  • .net连接MySQL的方法
  • .NET性能优化(文摘)
  • .NET中GET与SET的用法
  • @SuppressLint(NewApi)和@TargetApi()的区别