数据库设计与开发—初识SQLite与DbGate

一、SQLite与DbGate简介

(一)SQLite[1][3]

        SQLite 是一个部署最广泛、用 C 语言编写的数据库引擎,属于嵌入式数据库,其作为库被软件开发人员嵌入到应用程序中。

        SQLite 的设计允许在不安装数据库管理系统或不需要数据库管理员的情况下运行程序。与客户端 - 服务器数据库管理系统不同,SQLite 引擎没有应用程序与之通信的独立进程。相反,链接器将 SQLite 库(静态或动态)集成到应用程序中,该应用程序通过简单的函数调用使用 SQLite 的功能,减少数据库操作的延迟;对于并发很少的简单查询,SQLite 性能受益于避免进程间通信的开销。

SQLite使用优势

不需要一个单独的服务器进程或操作的系统(无服务器的)

②SQLite是轻量级的,完全配置时小于400KiB。同时,不依赖于任何外部库/模块;

一个完整的SQLite数据库是存储在一个单一的跨平台的磁盘文件

④SQLite事务完全兼容ACID,允许从多个进程或线程安全访问。同时,SQLite支持SQL92标准的大多数查询语言的功能;

⑤可多操作系统运行,包括Windows(Win32/WinCE/WinRT)、UNIX(Linux/Mac OS-X/Android/iOS)。

(二)DbGate[2]

       DbGate(Community)是一个开源免费的SQL+noSQL数据库的智能化管理、数据可视化客户端。

DbGate目标

①免费和开源;

②简单且功能强大,在工具栏中大量使用上下文菜单,提供便捷、易懂的使用体验;

③能够在多操作系统/多平台运行,包括Windows、Linux、Mac、Web browser、Mobile web(未来构想);

④稳定且鲁棒,保证数据库的安全正确运行;

⑤为大型数据库做准备,永远不将完整的表或查询结果加载到内存中,全部使用流操作;

⑥可使用脚本,基于dbgate nodejs 库包。

关联数据库图示(图源: DbGate | Open Source SQL+noSQL Database Client)

二、回调函数简述

        回调函数是一种在特定事件发生或特定条件满足时被调用的函数。回调函数通常作为参数传递给另一个函数,这个接收回调函数的函数在执行过程中,当满足特定条件时,会调用传递进来的回调函数。它的作用是允许在特定的时刻或特定的操作完成后执行自定义的逻辑。

回调函数的使用场景

①异步编程;

②事件处理;

③遍历数据结构对元素进行特定操作等。

使用回调函数的优势

①增加代码的灵活性。可以根据不同的需求传递不同的回调函数,从而在相同的执行流程中实现不同的行为;

②分离关注点。将特定操作的逻辑封装在回调函数中,使主函数更加专注于核心任务,从而提高代码的可读性和可维护性;

③实现异步执行。在异步编程中,回调函数使得程序能够在等待异步操作完成的同时继续执行其他任务,提高程序的相应性能。

注释

异步编程:异步编程是一种编程方式,它允许程序在执行某些耗时操作时,不会阻塞主线程的执行,而是继续执行其他任务,当耗时操作完成后,再通过回调函数事件触发其他机制来处理操作结果(传统的同步编程中,程序会按照顺序依次执行每个任务,等待一个任务完成后才会开始下一个任务)。

三、实践Demo

        Demo主要参考资料:SQLite – C/C++ | 菜鸟教程 (runoob.com)

        1、Windows操作系统下安装编译SQLite3的方法详见参考资料[5-6],已编译好的3.46.1版本SQLite文件库可见绑定资源。

        2、常规配置测试项目的VC++目录和链接器

        ①项目属性页->VC++目录->添加SQLite包含目录->添加SQLite库目录->应用;

        ②项目属性页->链接器->输入->添加附加依赖项sqlite3.lib->应用。

        3、测试代码

#include <iostream>
#include <sqlite3.h>using namespace std;static int callback(void* NotUsed, int argc, char** argv, char** azColName) {NotUsed = 0;for (int i = 0; i < argc; i++) {std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << std::endl;}std::cout << std::endl;return 0;
}int main() {sqlite3* db;char* errMsg = 0;int rc;// 打开数据库,如果不存在则创建rc = sqlite3_open("example.db", &db);if (rc) {std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << std::endl;sqlite3_close(db);return 1;}else {std::cout << "数据库打开成功" << std::endl;}// 创建表std::string sql = "CREATE TABLE IF NOT EXISTS MyTable(""ID INTEGER PRIMARY KEY AUTOINCREMENT,""Name TEXT,""Age INTEGER);";rc = sqlite3_exec(db, sql.c_str(), callback, 0, &errMsg);if (rc != SQLITE_OK) {std::cerr << "SQL 错误: " << errMsg << std::endl;sqlite3_free(errMsg);}else {std::cout << "表创建成功" << std::endl;}// 插入数据sql = "INSERT INTO MyTable(Name, Age) VALUES('John', 30);";rc = sqlite3_exec(db, sql.c_str(), callback, 0, &errMsg);if (rc != SQLITE_OK) {std::cerr << "SQL 错误: " << errMsg << std::endl;sqlite3_free(errMsg);}else {std::cout << "数据插入成功" << std::endl;}// 查询数据sql = "SELECT * FROM MyTable;";rc = sqlite3_exec(db, sql.c_str(), callback, 0, &errMsg);if (rc != SQLITE_OK) {std::cerr << "SQL 错误: " << errMsg << std::endl;sqlite3_free(errMsg);}// 关闭数据库sqlite3_close(db);return 0;
}

        4、打开DbGate连接数据库

        ①.db数据库文件获取。若未设置特定的数据库文件存储位置,那么VS2019编程平台会将其存储在解决方案(.sln)同目录下;

        ②连接SQLite数据库。File->Add connection->select connection type->选择对应的数据库类型(此处为SQLite)->在Database file处导入.db文件->Connect->即可。

四、实践结果

步骤3 数据库/表创建与数据插入测试结果
步骤4 DbGate管理可视化数据库结果

SQLite下载地址

Tags · sqlite/sqlite · GitHub(旧版本源码)

SQLite Download Page(最新版本,包含预编译二进制文件)

DbGate下载地址

DbGate | Open Source SQL+noSQL Database Client

DB Browser for SQLite下载地址(Github 21.1k星)

https://github.com/sqlitebrowser/sqlitebrowser

参考资料:

[1] https://en.wikipedia.org/wiki/SQLite

[2] An Introduction To The SQLite C/C++ Interface

[3] SQLite 教程 | 菜鸟教程 (runoob.com)

[4] 10 个 SQLite 数据库可视化工具(GUI)推荐 (zzxworld.com)

[5] Win11下基于VS2022编译SQLite3源码_sqlite下载 win11-CSDN博客(最新版本使用方法)

[6] sqlite/doc/compile-for-windows.md at master · sqlite/sqlite · GitHub(旧版本源码MSVC编译方法)

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

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

相关文章

sublime配置(竞赛向)

我也想要有jiangly一样的sublime 先决条件 首先&#xff0c;到官网上下载最新的sublime4&#xff0c;然后在mingw官网上下载最新的mingw64 mingw64官网&#xff1a;左边菜单栏点击dowloads,然后选择MinGW-W64-builds(可能会有点慢)——然后有时候会变成选LLVM-minGW,接着选择…

linux c国际化

一种locale表示一种文化的各种数据的表示或显示方式&#xff0c;一种locale分成多个部分&#xff0c;不同的部分由category表示&#xff0c;每一种category下面定义了很多关键字keyword locale -a 查看所有支持的locale&#xff0c; locale 不带参 查看当前locale的各个categ…

大语言模型怎么写好提示词,看这篇就够了

对于任何输入&#xff0c;大语言模型都会给出相应的输出&#xff0c;这些输入都可以成为提示词&#xff0c;通常&#xff0c;提示词由指令和输入数据组成&#xff0c;指令是任务&#xff0c;输入数据是完成的要求&#xff0c;其中指令应该明确&#xff0c;用词不能模棱两可&…

centos7.9升级rockylinux8.8

前言 查看centos的版本 &#xff0c;我这台服务器是虚拟机,下面都是模拟实验 升级前一定要把服务器上配置文件&#xff0c;数据等进行备份 [rootlocalhost ~]#cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]#uname -a Linux jenkins_ser…

【C++进阶】AVL树的实现

1. AVL的概念 AVL树是最先发明的⾃平衡⼆叉查找树&#xff0c;AVL是⼀颗空树&#xff0c;或者具备下列性质的⼆叉搜索树&#xff1a;它的左右⼦树都是AV树&#xff0c;且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树&#xff0c;通过控制⾼度差去控制平衡…

SLM201A系列24V, 15mA - 60mA单通道线性恒流LED驱动芯片 灯带灯条解决方案

SLM201A系列型号&#xff1a; SLM201A15aa-7G SLM201A20aa-7G SLM201A25aa-7G SLM201A30aa-7G SLM201A35aa-7G SLM201A40aa-7G SLM201A45aa-7G SLM201A50aa-7G SLM201A55aa-7G SLM201A60aa-7G SLM201A 系列产品是用于产生单通道、高…

基于FPGA的以太网设计(一)

以太网简介 以太网&#xff08;Ethernet&#xff09;是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准&#xff0c;它规定了包括物理层的连线、电子信号和介质访问控制的内容。以太网是目前应用最普遍的局域网技术&#xff0c;取代了其他局域网标准如…

【unity小技巧】Unity6 LTS版本安装和一些修改和新功能使用介绍

文章目录 前言安装新功能变化1、官方推荐使用inputsystem进行输入控制2、修复了InputSystem命名错误导致listen被遮挡的bug3、自带去除unity启动画面logo功能4、unity官方的behavior行为树插件5、linearVelocity代替过时的velocity方法待续 完结 前言 2024/10/17其实unity就已…

gitlab:ssh设置

我用的是window&#xff0c;先打开终端&#xff1a; 1、输入 ssh-skygen 执行 然后输入路径&#xff0c;路径地址就是后面括号内的内容 2、然后直接下一步下一步即可&#xff0c;像上面那样就成了 3、打开公钥&#xff0c;复制 4、打开gitlab&#xff0c;在我的 Edit profil…

JUnit 单元测试(详解)

&#x1f680; 个人简介&#xff1a;某大型国企资深软件开发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…

shell脚本宝藏仓库(基础命令、正则表达式、shell基础、变量、逻辑判断、函数、数组)

一、shell概述 1.1 shell是什么 Shell是一种脚本语言 脚本&#xff1a;本质是一个文件&#xff0c;文件里面存放的是特定格式的指令&#xff0c;系统可以使用脚本解析器、翻译或解析指令并执行&#xff08;shell不需要编译&#xff09; Shell既是应用程序又是一种脚本语言&…

C++中类间相互引用与析构函数调用的潜在风险及解决方案

C中类间相互引用与析构函数调用的潜在风险及解决方案 一、前言二、举例说明三、问题分析四、解决方案 一、前言 在C中&#xff0c;当两个类A和B之间存在相互引用&#xff0c;并且在A的析构函数中调用B的成员函数&#xff0c;同时B的成员函数又尝试访问A的对象或调用A的成员函数…

《深度学习》Dlib、OpenCV 轮廓绘制

目录 一、Dlib轮廓绘制 1、什么是轮廓绘制 2、步骤 1&#xff09;导入所需的库和模型 2&#xff09;加载人脸检测器 3&#xff09;读取图像 4&#xff09;人脸检测 5&#xff09;关键点定位 6&#xff09;绘制轮廓线条 7&#xff09;展示结果 二、案例实现 1、完整代码 运…

【华为】静态NAT、动态NAT、NAPT、Easy IP、NAT Server

静态 NAT&#xff1a;将内网主机的私网 IP地址一对一映射到公网 IP 地址。动态 NAT&#xff1a;将内网主机的私有地址转换为公网地址池里面的地址。由于静态NAT严格地一对一进行地址映射&#xff0c;这就导致即便内网主机长时间离线或者不发送数据时&#xff0c;与之对应的公有…

Mac 电脑安装redis

1、首先检查电脑是否安装 brew 命令&#xff1a; #打开Mac自带的终端&#xff0c;输入下面命令 brew --version如下图&#xff0c;可以看到我的 brew 正常的&#xff0c;且对应版本是4.0.17-63-g32f2258 如果你的电脑执行上面命名报错&#xff1a;zsh: command not found: br…

一个很恶心但发顶会很牛的方向!【小样本学习+目标检测】

【小样本学习目标检测】致力于通过有限的标注样本实现高效的目标检测&#xff0c;以应对数据匮乏的挑战。这一领域的研究对于缩小人工智能与人类学习系统之间的差异、增强模型对新类别的适应能力、推动智能识别系统在实际场景中的应用具有重要意义。 为了帮助研究人员深入理解…

【可答疑】基于51单片机的智能衣柜(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

多进程编辑

使用父子进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半&#xff0c;子进程拷贝后一半&#xff0c;两个进程同时进行 #include <myhead.h> int main(int argc, const char *argv[]) {//用于保存pid号pid_t pid -1;//创建子进程pid fork();//打印一下进程号print…

C语言 | Leetcode C语言题解之第491题非递减子序列

题目&#xff1a; 题解&#xff1a; int** ans; int ansSize; int* temp; int tempSize;void dfs(int cur, int last, int* nums, int numsSize, int** returnColumnSizes) {if (cur numsSize) {if (tempSize > 2) {ans[ansSize] malloc(sizeof(int) * tempSize);memcpy(…

oracle归档日志爆满问题处理

最近客户单位的oracle数据库出了问题&#xff0c;经常出现无法连接,报错提示 ORA-00257: archiver error, Connect internal only, until freed.&#xff0c;手动清除归档日志后可以恢复访问&#xff0c;但是过不了几天依旧会爆满&#xff0c;每日生成的归档日志很大。经过详细…