嵌入式数据库概念和基本命令的使用

news2024/11/19 16:38:52

文章目录

  • 前言
  • 一、sqlite数据库概念
  • 二、sqlite数据库命令分类和使用
    • 1.命令分类
      • 1. 系统命令:
      • 2. SQLite 命令:
    • 2.系统命令的使用
    • 3.sqlite命令的使用
  • 三、sqlite C语言函数的使用和编程方法
  • 总结


前言

本篇文章将为大家讲解嵌入式数据库的使用,嵌入式数据的话主要是使用sqlite数据库。

一、sqlite数据库概念

SQLite 是一种轻量级的嵌入式关系型数据库管理系统(RDBMS),它被广泛应用于各种应用程序中,从移动应用到桌面应用再到 Web 应用。以下是关于 SQLite 数据库的一些概念解释:

  1. 嵌入式数据库管理系统(Embedded Database Management System):SQLite 是一种嵌入式数据库,这意味着它不需要独立的服务器进程来管理数据库。相反,SQLite 数据库引擎被直接集成到应用程序中,数据库以文件的形式存储在主机文件系统中。

  2. 关系型数据库管理系统(RDBMS):SQLite 是关系型数据库管理系统的一种,这意味着它使用表、行和列来组织和存储数据。它支持 SQL(Structured Query Language)作为与数据库交互的标准语言。

  3. 轻量级(Lightweight):SQLite 设计用于在资源有限的环境下运行,并且具有小巧、快速和高效的特点。它的库文件大小相对较小,且资源消耗较低,适用于嵌入式系统和移动设备等场景。

  4. 零配置(Zero Configuration):使用 SQLite 时,不需要进行复杂的配置或管理。只需包含 SQLite 库并在应用程序中指定数据库文件的路径,即可开始使用。

  5. 单用户访问(Single-User Access):SQLite 不支持多用户同时访问同一数据库文件。只有一个用户(即应用程序)可以连接到数据库并对其进行读写操作。这在某些情况下可能是限制,但也确保了数据的完整性和一致性。

  6. 跨平台性(Cross-Platform):SQLite 可以在多种操作系统上运行,包括 Windows、macOS、Linux 等,因此它是一个跨平台的解决方案。

  7. 事务支持(Transaction Support):SQLite 支持事务,允许将一系列数据库操作组合成一个逻辑单元,要么全部成功执行,要么全部失败回滚。这有助于确保数据的一致性和完整性。

  8. 自包含性(Self-Contained):SQLite 数据库被存储在单个文件中,并且所有的数据库操作都在该文件内执行。这种自包含性使得 SQLite 数据库易于传输、备份和维护。

总的来说,SQLite 是一种简单、快速、易于使用的数据库解决方案,特别适用于对数据库性能要求不高、规模较小的应用程序。

二、sqlite数据库命令分类和使用

1.命令分类

当谈到 SQLite 数据库命令时,可以将其分为两类:系统命令和 SQLite 特定的命令。

1. 系统命令:

系统命令是在命令行界面或终端中执行的命令,用于管理 SQLite 数据库和与操作系统交互。这些命令通常不是 SQLite 引擎的一部分,而是与 SQLite 交互的外部工具或系统级命令。

一些常见的系统命令包括:

  • sqlite3命令:用于启动 SQLite 数据库的命令行 shell,使用户能够与 SQLite 数据库进行交互。
  • 操作系统命令:例如在 Unix/Linux 系统中的 ls、cd 等命令,或在 Windows 中的 dir、cd 等命令,用于管理文件和目录。

2. SQLite 命令:

SQLite 命令是在 SQLite 数据库命令行 shell 中执行的命令,用于管理数据库、执行查询、事务控制等操作。这些命令是 SQLite 引擎的一部分,直接与 SQLite 数据库进行交互。

一些常见的 SQLite 命令包括:

  • DDL 命令(数据定义语言):用于定义、修改和删除数据库对象,例如 CREATE TABLE、ALTER TABLE、DROP TABLE 等。
  • DML 命令(数据操作语言):用于执行对数据库中的数据进行增、删、改的操作,例如 INSERT、UPDATE、DELETE。
  • DQL 命令(数据查询语言):用于执行对数据库中的数据进行查询的操作,例如 SELECT。
  • 事务控制命令:用于管理事务的开始、提交、回滚等,例如 BEGIN TRANSACTION、COMMIT、ROLLBACK。

这些 SQLite 命令是在 SQLite shell 中执行的,它们提供了一种直接与 SQLite 数据库进行交互的方式,并且可以通过脚本或编程语言中的 SQLite API 进行扩展和自动化。

2.系统命令的使用

1.查看帮助文档:

.help

在这里插入图片描述
2.显示当前输出模式:

.show

在这里插入图片描述
3.打开/关闭输出展示模式(可选为列模式或者显示模式):

.mode column  -- 列模式
.mode line    -- 行模式
.mode csv     -- CSV 模式

4.退出 SQLite3:

.quit

在这里插入图片描述

3.sqlite命令的使用

1.创建数据库:

sqlite3 mydatabase.db

这个命令会创建一个名为mydatabase.db的SQLite数据库文件,并打开一个SQLite shell供你进行交互式操作。
在这里插入图片描述
2.创建表:

CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    username TEXT,
    email TEXT UNIQUE,
    age INTEGER
);

这个命令会在数据库中创建一个名为users的表,包含id、username、email和age四个列。id列是主键,并且email列是唯一的。

在这里插入图片描述
3.插入数据:

INSERT INTO users (username, email, age) VALUES ('John', 'john@example.com', 30);

在这里插入图片描述
4.查询数据:

SELECT * FROM users;

这个命令会从users表中检索所有数据。

在这里插入图片描述
5.更新数据:

UPDATE users SET age = 31 WHERE username = 'John';

在这里插入图片描述
6.删除数据:

DELETE FROM users WHERE username = 'John';

在这里插入图片描述
7.退出SQLite shell:

.quit

三、sqlite C语言函数的使用和编程方法

SQLite提供了一组C语言API函数,使开发者可以在C程序中使用SQLite数据库。下面是一些常用的SQLite C语言函数以及它们的意思和用法:

  1. sqlite3_open()

    • 作用:用于打开一个SQLite数据库连接。
    • 参数:
      • const char *filename:数据库文件名。
      • sqlite3 **ppDb:指向sqlite3指针的指针,用于存储数据库连接对象。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。
  2. sqlite3_close()

    • 作用:关闭先前由sqlite3_open()函数打开的数据库连接。
    • 参数:
      • sqlite3 *db:数据库连接对象。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。
  3. sqlite3_exec()

    • 作用:执行SQL语句,并对每个执行的结果调用一个回调函数。
    • 参数:
      • sqlite3 *db:数据库连接对象。
      • const char *sql:要执行的SQL语句。
      • int (*callback)(void*, int, char**, char**):回调函数,用于处理执行结果。
      • void *data:传递给回调函数的数据。
      • char **errmsg:指向错误信息的指针,若执行过程中发生错误,会将错误信息存储在这里。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。
  4. sqlite3_prepare_v2()

    • 作用:编译SQL语句,创建一个准备语句对象。
    • 参数:
      • sqlite3 *db:数据库连接对象。
      • const char *sql:要编译的SQL语句。
      • int sql_len:SQL语句的长度(如果为-1,则SQLite会自动计算)。
      • sqlite3_stmt **stmt:指向sqlite3_stmt指针的指针,用于存储准备语句对象。
      • const char **pzTail:指向剩余未处理的SQL语句的指针。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。
  5. sqlite3_step()

    • 作用:执行准备好的SQL语句的下一步操作。
    • 参数:
      • sqlite3_stmt *stmt:准备语句对象。
    • 返回值:若操作成功,返回SQLITE_ROW(表示查询结果行)或SQLITE_DONE(表示执行完成);否则返回其他错误码。
  6. sqlite3_bind_XXX()

    • 作用:绑定参数到准备好的SQL语句中。
    • 参数:
      • sqlite3_stmt *stmt:准备语句对象。
      • int idx:参数索引,从1开始。
      • XXX value:要绑定的参数值,XXX代表不同数据类型,例如sqlite3_bind_int()、sqlite3_bind_text()等。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。
  7. sqlite3_column_XXX()

    • 作用:获取查询结果中指定列的值。
    • 参数:
      • sqlite3_stmt *stmt:准备语句对象。
      • int idx:列索引,从0开始。
    • 返回值:列的值,XXX代表不同数据类型,例如sqlite3_column_int()、sqlite3_column_text()等。
  8. sqlite3_finalize()

    • 作用:释放准备语句对象所占用的资源。
    • 参数:
      • sqlite3_stmt *stmt:准备语句对象。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。

这些是SQLite C语言API中的一些常用函数,通过它们可以在C程序中实现对SQLite数据库的操作。

#include <stdio.h>
#include <sqlite3.h>

// 回调函数用于处理查询结果
int callback(void *data, int argc, char **argv, char **azColName){
    int i;
    printf("%s: ", (const char*)data);
    for(i = 0; i < argc; i++){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main(int argc, char* argv[]) {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;

    // 打开数据库连接
    rc = sqlite3_open("test.db", &db);
    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return(0);
    } else {
        fprintf(stderr, "Opened database successfully\n");
    }

    // 创建表
    const char *sql_create = "CREATE TABLE IF NOT EXISTS COMPANY("  \
                             "ID INT PRIMARY KEY     NOT NULL," \
                             "NAME           TEXT    NOT NULL," \
                             "AGE            INT     NOT NULL," \
                             "ADDRESS        CHAR(50)," \
                             "SALARY         REAL );";

    rc = sqlite3_exec(db, sql_create, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Table created successfully\n");
    }

    // 插入数据
    const char *sql_insert = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
                             "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
                             "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
                             "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "     \
                             "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
                             "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
                             "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
                             "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";

    rc = sqlite3_exec(db, sql_insert, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Records created successfully\n");
    }

    // 查询数据
    const char *sql_select = "SELECT * from COMPANY";
    printf("Selecting records...\n");
    rc = sqlite3_exec(db, sql_select, callback, (void*) "Select", &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }

    // 关闭数据库连接
    sqlite3_close(db);
    return 0;
}

这个示例程序完成了以下操作:

打开一个名为"test.db"的数据库连接。

创建一个名为"COMPANY"的表,包含ID、NAME、AGE、ADDRESS和SALARY字段。

插入一些记录到"COMPANY"表中。

查询"COMPANY"表中的所有记录,并打印输出。

关闭数据库连接。

你可以根据需要修改SQL语句以及数据处理部分来完成其他操作,比如更新数据、删除数据等。

总结

本篇文章主要讲解了数据库的概念和数据库的一些基本命令的使用,这篇文章就讲解到这里,下篇文章我们继续讲解。

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

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

相关文章

0510Goods的Maven项目

0510Goods的Maven项目包-CSDN博客 数据库字段 商品主页 修改页面 点击商品主页更改信息&#xff0c; 跳转到修改页面&#xff0c; 并保留初始信息。 商品类别最多选取三项&#xff0c;最少选取一项 添加界面 商品类别最多选取三项&#xff0c;最少选取一项

知乎广告推广投放流程以及价格?

知乎作为一个拥有庞大高质量用户群体的知识分享平台&#xff0c;成为了众多品牌不可忽视的广告投放渠道。知乎不仅汇聚了各行各业的专业人士&#xff0c;其独特的社区氛围也为品牌提供了精准触达目标受众的机会。知乎广告推广的投放流程、费用标准&#xff0c;云衔科技提供的专…

如何使用恢复模式修复Mac启动问题?这里提供详细步骤

如果你的Mac无法启动,不要惊慌,Mac有一个隐藏的恢复模式,你可以使用它来诊断和修复任何问题,或者在需要时完全重新安装macOS。以下是如何使用它。 如何在Mac上启动到恢复模式 你需要做的第一件事是启动到恢复模式。尽管操作说明会因你使用的Mac电脑而异,但幸运的是,启动…

15-ps命令

常用选项 aux axjf a&#xff1a;显示一个终端所有的进程u&#xff1a;显示进程的归属用户及内存使用情况x&#xff1a;显示没有关联控制终端j&#xff1a;显示进程归属的进程组idf&#xff1a;以ASCII码的形式显示出进程的层次关系 ps aux其中| more是只显示一部分内容&…

RT-DETR改进教程|加入SCNet中的SCConv[CVPR2020]自校准卷积模块!

⭐⭐ RT-DETR改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ⭐⭐ 一、 论文介绍 论文链接&#xff1a;http://mftp.mmcheng.net/Papers/20cvprSCNet.pdf 代码链接&#xff1a;https://gitcode.com/MCG-NKU/SCNet/ 文章摘要&#xff1a; CNN的最新进展主要致力于设计更…

一个完美的自动化测试框架应该怎么写?

一、什么是自动化测试框架&#xff1f; 自动化测试框架是为自动化测试用例或者脚本提供执行环境而搭建的基础设施。自动化测试框架有助于有效地开发、执行和报告自动化测试用例。 优点&#xff1a; 代码复用 提高测试效率 更高的测试覆盖率 维护成本低 更早发现和记录bug …

八年前端开发之路中遇到的一些实用技巧分享——代码思路及通用场景

在开发中比较有用的代码思路 1. 链式编程2. 高阶函数应用-(添加数据并提供删除方法)3. 利用Promise链切入&#xff08;延迟执行&#xff09;4. 通过中间层来解决问题&#xff08;装饰者模式&#xff09;5. 单例模式 1. 链式编程 所谓链式编程即是函数调用后返回对象本身 let …

LangChain 核心模块学习、Model I/O部分、llms代码介绍

LangChain 核心模块学习&#xff1a;Model I/O input 提示词 output 大模型输出的结果 Model I/O 是 LangChain 为开发者提供的一套面向 LLM 的标准化模型接口&#xff0c;包括模型输入&#xff08;Prompts&#xff09;、模型输出&#xff08;Output Parsers&#xff09;和模型…

Linux-线程

目录 1. 线程概念 2. 线程vs进程 3. 线程的优缺点 4. 线程创建 4.1 pthread_create 4.2 pthread_self 5. 线程终止 5.1 return 5.2 pthread_exit 5.3 pthread_cancel 6. 线程等待 7. 线程分离 1. 线程概念 线程&#xff1a;轻量级进程&#xff0c;在进程内部执行&a…

【Linux】自动化编译工具——make/makefile(超细图例详解!!)

目录 一、前言 二、make / Makefile背景介绍 &#x1f95d;Makefile是干什么的&#xff1f; &#x1f347;make又是什么&#xff1f; 三、demo实现【见见猪跑&#x1f416;】 四、依赖关系与依赖方法 1、概念理清 2、感性理解【父与子&#x1f468;】 3、深层理解【程序…

什么是Unreal Engine游戏引擎?它有什么优势?

大家好&#xff0c;我是咕噜土豆&#xff0c;很高兴又和大家见面了。在游戏开发行业中&#xff0c;选择合适的游戏引擎是非常重要的。其中&#xff0c;Unreal Engine作为一款功能强大的游戏引擎&#xff0c;在业界非常受欢迎。今天我带大家简单的了解一下。 什么是Unreal Engi…

python中的数据可视化:极坐标散点图

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 python中的数据可视化&#xff1a; 极坐标散点图 [太阳]选择题 关于以下代码输出结果的说法中正确的是? import matplotlib.pyplot as plt import numpy as np n 150 r 2 * np.r…

揭秘奇葩环境问题:IDEA与Maven版本兼容性解析

1.问题描述 最近在实现通过Java爬虫获取网页源码&#xff0c;然后紧接着将源码转换为图片上传到OSS服务器&#xff0c;其中探索了很多办法&#xff0c;但是在实现过程中遇到一个奇葩问题&#xff0c;就是我无论下载任何Maven依赖&#xff0c;都无法正常下载&#xff0c;简直是…

鸿蒙原生应用数量激增20倍,鸿蒙生态“一路狂奔”!

过去几个月&#xff0c;在各地政府和千行百业伙伴的全面支持下&#xff0c;鸿蒙生态建设正在以前所未有的速度和规模蓬勃发展。 鸿蒙生态跑出“加速度”&#xff0c;再迎里程碑进展 从1月华为宣布首批200多家应用厂商加速开发鸿蒙原生应用以来&#xff0c;到3月底已有超4000款…

DeepSort / Sort 区别

推荐两篇博文,详细介绍了deepsort的流程及代码大致讲解: https://blog.csdn.net/qq_48764574/article/details/138816891 https://zhuanlan.zhihu.com/p/196622890 DeepSort与Sort区别: 1、Sort 算法利用卡尔曼滤波算法预测检测框在下一帧的状态,将该状态与下一帧的检测结…

【C++】内联函数、auto、范围for

文章目录 1.内联函数2.auto关键字2.1auto简介2.2auto的注意事项2.3auto不能推导的场景 3.基于范围的for循环(C11)4.指针空值nullptr(C11) 1.内联函数 概念&#xff1a; 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函…

哈希算法在区块链中的应用

哈希算法是区块链技术的核心组件之一&#xff0c;它确保了区块链数据的不可篡改性和安全性。在本文中&#xff0c;我们将探讨哈希算法的基本原理&#xff0c;以及它在区块链中的具体应用。 哈希算法的基本原理 哈希算法是一种数学函数&#xff0c;它接收输入&#xff08;或“消…

STL——deque容器【双端动态数组】

deque容器的基本概念&#xff1a; 功能&#xff1a;双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector的区别&#xff1a; vector队友头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度会比vecto…

银行业数据运营场景下的数据埋点方案

1、引言 随着金融科技的快速发展&#xff0c;银行业的数据运营变得日益重要。数据埋点作为数据收集的重要手段&#xff0c;对于银行业务的精细化运营、风险管理和产品迭代等方面起着至关重要的作用。本方案将针对银行业数据运营场景&#xff0c;设计一套完整的数据埋点方案&am…

OFDM802.11a的FPGA实现(十五)短训练序列:STS(含Matlab和verilog代码)

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 1.前言 在之前已经完成了data域数据的处理&#xff0c;在构建整个802.11a OFDM数据帧的时候&#xff0c;还剩下前导码和signal域的数据帧&#xff0c;这两部分的内容。 PLCP的前导部分…