数据库设计与开发—初识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编译方法)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++中的继承(1)

1.继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许我们在保持原有类特性的基础上进行扩展&#xff0c;增加⽅法(成员函数)和属性(成员变量)&#xff0c;这样产生新的类&#xff0c;称派生类&#xff08;也被称为子类&…

Vue 3集成海康Web插件实现视频监控

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;组件封装篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来组件封装篇专栏内容:Vue 3集成海康Web插件实现视频监控 引言 最近在项目中使用了 Vue 3 结合海康Web插件来实…

Django项目创建

安装 pip install django 创建项目 首先打开powershell打开项目与创建到的文件夹 django-admin startproject django_demo01 django-admin startproject 项目名 多出了一个django_demo01的文件夹&#xff0c;这就是我们的项目了 打开项目文件夹&#xff0c;发现一个文件和…

必读推荐:掌握大模型应用的精华书籍,非常详细收藏我这一篇就够了

在这个信息爆炸的时代&#xff0c;人工智能正以前所未有的速度和规模渗透到我们生活的方方面面。其中&#xff0c;大模型应用作为 AI 领域的一大亮点&#xff0c;不仅在学术界引起广泛关注&#xff0c;更在工业界展现出巨大的应用潜力。从自然语言处理到图像识别&#xff0c;从…

最新必应Bing开户条件、流程及注意事项介绍

有效的广告推广对于企业提升品牌影响力和市场占有率至关重要。微软旗下的必应Bing搜索引擎&#xff0c;作为全球知名的搜索平台之一&#xff0c;为企业提供了精准、高效的广告推广服务。那么&#xff0c;如何在必应上开设广告账户呢&#xff1f;下面将详细介绍必应广告开户的条…

springboot 整合 快手 移动应用 授权 发布视频 小黄车

前言&#xff1a; 因快手文档混乱&#xff0c;官方社区技术交流仍有很多未解之谜&#xff0c;下面3种文档的定义先区分。 代码中的JSON相关工具均用hutool工具包 1.快手 移动双端 原生SDK 文档https://mp.kuaishou.com/platformDocs/develop/mobile-app/ios.html 2.快手 Api 开…

探索光耦:光耦——不间断电源(UPS)系统中的安全高效卫士

在现代社会&#xff0c;不间断电源&#xff08;UPS&#xff09;系统已成为保障关键设备和数据安全的关键设施&#xff0c;广泛应用于企业数据中心、家庭电子设备等场景。UPS能在电力中断或波动时提供稳定电力&#xff0c;确保设备持续运行。而在这套系统中&#xff0c;光耦&…

深入理解AQS:并发编程中的利器及其在业务场景中的应用

1. 什么是AQS&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff1f; AQS&#xff0c;全称为AbstractQueuedSynchronizer&#xff0c;是Java并发包中核心的基础框架&#xff0c;用于构建锁和同步器。它是java.util.concurrent.locks包中的基础组件&#xff0c;为多个…

屏幕画面卡住不动声音正常怎么办?电脑屏幕卡住不动解决方法

在数字时代&#xff0c;电脑作为我们日常生活与工作中不可或缺的伙伴&#xff0c;偶尔也会遇到一些小状况。其中&#xff0c;“屏幕画面卡住不动&#xff0c;但是声音依然正常”的情况就是一种常见的问题。本文将探讨这一现象的原因&#xff0c;并提供几种可能的解决方案&#…

FSCapture 9.3 | 全能截图与录屏解决方案。

FastStone Capture 是一款轻量级但功能全面的屏幕捕捉工具&#xff0c;能够轻松捕获并标注屏幕上的一切内容&#xff0c;包括窗口、对象、菜单、全屏、矩形/自由区域以及滚动窗口或网页。此外&#xff0c;它还支持录制屏幕活动、声音和网络摄像头&#xff0c;并将这些内容保存为…

[复现]比较6种股市趋势识别方

作者: Filippos Tzimopoulos 翻译整理&#xff1a;进击的小学生 文章名称: I compared 6 methods to identify the trend of the stock market. These are the results! code 与 datas &#xff0c;请转至获取&#xff01; 背景说明 通过识别市场方向&#xff0c;交易者可…

webAPI中的排他思想、自定义属性操作、节点操作(配大量案例练习)

一、排他操作 1.排他思想 如果有同一组元素&#xff0c;我们想要某一个元素实现某种样式&#xff0c;需要用到循环的排他思想算法&#xff1a; 1.所有的元素全部清除样式 2.给当前的元素设置样式 注意顺序能不能颠倒&#xff0c;首先清除全部样式&#xff0c;再设置自己当前的…

dyna批处理代码,无需蹲守,自行连续计算

用此代码即可 上面一行是模型位置 下面一行是DYNA模拟器位置 第三个框框是K文件名称 上述三者改成自己的 然后复制修改即可 复制几个就几个进行批处理

深入理解伪元素与伪类元素

在“探秘盒子浮动&#xff0c;破解高度塌陷与文字环绕难题&#xff0c;清除浮动成关键&#xff01;”中&#xff0c;我们讲到如果父盒由于各种原因未设置高度&#xff0c; 子盒的浮动会导致父盒的高度塌陷。为了解决高度塌陷的问题&#xff0c;我们可以添加伪元素。 一、伪元素…

Android 内存优化——常见内存泄露及优化方案

看到了一篇关于内存泄漏的文章后&#xff0c;就想着分享给大家&#xff0c;最后一起学习&#xff0c;一起进步&#xff1a; 如果一个无用对象&#xff08;不需要再使用的对象&#xff09;仍然被其他对象持有引用&#xff0c;造成该对象无法被系统回收&#xff0c;以致该对象在…

【element-tiptap】如何修改选中内容时的背景颜色?

前言&#xff1a;element-tiptap 用鼠标选中内容的时候&#xff0c;背景颜色跟系统设置的主题有关&#xff0c;比如的我的就是卡哇伊的pink&#xff0c;默认是淡蓝色 但是我们观察一下语雀&#xff0c;背景颜色是它规定好的颜色 这篇文章来探索一下&#xff0c;怎么自己规定选…

教学平台的智能化升级:Spring Boot应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

除GOF23种设计模式之简单工厂模式

文章目录 1. 简介2. 代码2.1 抽象类&#xff1a;Course.java2.2 产品A:JavaCourse.java2.3 产品B:PythonCourse.java2.4 工厂:CourseFactory.java2.5 测试&#xff1a;Test.java 3. 心得参考链接&#xff08;无&#xff09; 1. 简介 简单工厂模式(Simple Factory Patern):又称…

数据结构4——栈

1. 栈的概念及结构 栈的概念&#xff1a; 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则…

【SuperHotSwap】IDEA零配置热更新插件升级

往期往期插件v1.0.0发布的时候我发表了一篇文章&#xff0c;如下&#xff1a; 支持功能 如今插件迭代了数个版本&#xff0c;现在迎来了v1.9.0版本的重大升级。如下是支持功能。 支持功能是否支持说明MybatisXML热更新√Class热更新√增强功能需安装dcevm补丁。支持动态新增类…