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

基于嵌入式Linux的数据库

数据库

数据库是在数据库管理系统和控制之下,存放在存储 介质上的数据集合。

基于嵌入式的数据库

基于嵌入式linux的数据库主要有SQlite,

Firebird,Berkeley DB,eXtremeDB

        Firebird是关系型数据库,功能强大,支持存储过 程,SQL兼容等

        SQlite关系型数据库体积小,支持ACID事务

        Berkeley DB中并没有数据库服务器的概念,它的程 序直接链接到应用程序中

        eXtremeDB是内存数据库,运行效率高

SQlite基础

SQLite的源码是C语言,其源代码完全开发,SQLite

第一个Alpha版本诞生于2000年5月,他是一个轻量 级的嵌入式数据库。

SQLite有以下特性 零配置,无需安装和管理配置 存储在单一磁盘文件中的一个完整的数据库 数据库文件可以在不同字节顺序的机器间自由共享支持数据库大小至2TB

足够小,全部源码大致三万行C代码,250KB

比目前留下的大多数数据库对数据的操作更快

创建数据库

1.在线安装

sudo apt-get install sqlite3

2.本地安装

官网下载sqlite3,然后本地安装:sudo dpkg -i *.deb

3.SQlite3 基本命令

1.系统命令 以 . 开头的命令

        .help 帮助

        .quit 退出

        .schema查看表结构

        .databases 查看打开的数据库

        .table 

2.sql命令

基本的sql命令,不以 . 开头,但是都要 结尾

创建一张数据库的表

        stucreate table stu(id Integer,name char,score Integer);

插入一张记录

        insert into stu values(1001,'zhangsan',80);

插入部分字段记录

        insert into stu(name,score) values(1002,'lisi');

查询所有记录

        select *from stu

查询数据库部分内容字段

        select name,score from stu

根据属性查询

        select * from stu where score=80; select *from stu where score=80 and name='zhangsan';

删除一条记录

        delede from stu where id=1003; delete from stu where socre='90';

更新一条记录

        update stu set name='wangwu' where id=1001; update stu set name='wangwu',score=88 where id = 1001;

添加一列

        alter table stu add column address char;

删除一列

1.创建一张表 提取字段

create table stu1 as select id,name,score from stu;

2.删除原有表

drop table stu;

3.将新的表的名字改成原有的表名字

alter table stu1 rename to stu;

SQlite编程接口

4.API操作

1.int sqlite3_open(char *filename,sqlite3 **db)

        功能:打开sqlite数据库 参数:

        filename:数据库文件路径

        db:指向sqlite句柄的指针

返回值:

        成功返回0,失败返回错误码(非0值)

2.int sqlite3_close(sqlite3 *db);

        功能:关闭sqlite数据库 参数:

        db 操作数据库的指针

返回值:

               成功返回0,失败返回错误码

3.const char *sqlite3_errmsg(sqlite3 *db);

        功能:通过DB句柄得到数据库操作的错误信息

参数:

        db 操作数据库的指针       

        返回值: 返回错误信息的首地址

4.int sqlite3_exec(const char *sql, int (*callback)(void *,int,char**,char *8) void *, char **errmsg);

        功能:执行一条sql语句

参数

        db:数据库操作句柄

        sql:一条sql语句

        sqlite3*db,

        callback:回调函数,只有sql为查询语句的时候, 才会执行此语句

        void * :给回调函数传递参数

        errmsg:错误信息

返回值:

        成功:SQLITE_OK

int (*callback)(void *,int,char**,char *8)

        功能:查询结果,是一个函数指针类型,传递一个函数名

回调函数接口:

typedef int(*sqlite3_callback)( void *para, int f_num, char ** f_value, char ** f_name)

        功能: 每找到一条记录自动执行一次回调函数

        para:传递给回调函数的参数

        f_num:记录中包含的字段数目

        f_value:包含每个字段值的指针数组

        f_name:包含每个字段名称的指针数组

返回值,

        成功返回0,失败返回-1

不使用回调函数执行SQL语句

int sqlite3_get_table( sqlite3 *db, const char *sql, char ***resultp,int *nrow, int *ncolumu,char **errmsg)

        功能:执行sql操作

        db:数据库句柄

        sql:sql语句

        resultp:用来指向sql执行结果的指针

        nrow:满足条件的记录的数目

        ncolumn:每条记录包含的字段数目

        errmsg:错误信息指针的地址

返回值:

        成功返回0,失败返回错误码

#include <stdio.h>  
#include <stdlib.h>  
#include <sqlite3.h>  // sqlite3_callback 类型的回调函数  
int callback(void *NotUsed, int argc, char **argv, char **azColName){  int i;  for(i = 0; i<argc; i++){  printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");  }  printf("\n");  return 0;  
}  int main() {  sqlite3 *db;  char *err_msg = 0;  int rc;  char **result;  int row, column;  // 打开数据库  rc = sqlite3_open("test.db", &db);  if (rc) {  fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));  return 1;  }  // 使用 sqlite3_exec 和回调函数  rc = sqlite3_exec(db, "SELECT * FROM my_table", callback, 0, &err_msg);  if (rc != SQLITE_OK ){  fprintf(stderr, "SQL错误: %s\n", err_msg);  sqlite3_free(err_msg);  sqlite3_close(db);  return 1;  }  // 使用 sqlite3_get_table 获取结果  rc = sqlite3_get_table(db, "SELECT * FROM my_table", &result, &row, &column, &err_msg);  if (rc != SQLITE_OK) {  fprintf(stderr, "SQL错误: %s\n", err_msg);  sqlite3_free(err_msg);  sqlite3_close(db);  return 1;  }  // 输出 sqlite3_get_table 的结果  printf("sqlite3_get_table 结果:\n");  for (int i = 0; i < row + 1; i++) {  for (int j = 0; j < column; j++) {  printf("%s ", result[i*column + j] ? result[i*column + j] : "NULL");  }  printf("\n");  }  // 释放结果  sqlite3_free_table(result);  // 关闭数据库  sqlite3_close(db);  return 0;  
}

相关文章:

基于嵌入式Linux的数据库

数据库 数据库是在数据库管理系统和控制之下&#xff0c;存放在存储 介质上的数据集合。 基于嵌入式的数据库 基于嵌入式linux的数据库主要有SQlite&#xff0c; Firebird,Berkeley DB,eXtremeDB Firebird是关系型数据库&#xff0c;功能强大&#xff0c;支持存储过 程&…...

C# 使用LINQ找出一个子字符串在另一个字符串中出现的所有位置

一、实现步骤 遍历主字符串&#xff0c;使用IndexOf方法查找子字符串的位置。如果找到了子字符串&#xff0c;记录其位置&#xff0c;并且从该位置的后面继续查找。重复上述步骤直到遍历完整个字符串。 二、简单代码示例 using System; using System.Collections.Generic; usi…...

YOLOv8添加MobileViTv3模块(代码+free)

目录 一、理由 二、方法 &#xff08;1&#xff09;导入MobileViTv3模块 &#xff08;2&#xff09;在ultralytics/nn/tasks.py的函数parse_model中修改 &#xff08;3&#xff09;在yaml配置文件中写入 &#xff08;4&#xff09;开始训练&#xff0c;先把其他梯度关闭&…...

从概念到落地:全面解析DApp项目开发的核心要素与未来趋势

随着区块链技术的迅猛发展&#xff0c;去中心化应用程序&#xff08;DApp&#xff09;逐渐成为Web3时代的重要组成部分。DApp通过智能合约和分布式账本技术&#xff0c;提供了无需信任中介的解决方案&#xff0c;这种去中心化的特性使其在金融、游戏、社交等多个领域得到了广泛…...

仓颉编程入门 -- 泛型概述 , 如何定义泛型函数

泛型概述 , 如何定义泛型函数 1 . 泛型的定义 在仓颉编程语言中&#xff0c;泛型机制允许我们定义参数化类型&#xff0c;这些类型在声明时不具体指定其操作的数据类型&#xff0c;而是作为类型形参保留&#xff0c;待使用时通过类型实参来明确。这种灵活性在函数和类型声明中…...

SOC估算方法之(OCV-SOC+安时积分法)

一、引言 此方法主要参考电动汽车用磷酸铁锂电池SOC估算方法这篇论文 总结&#xff1a; 开路电压的测量需要将电池静止相当长的一段时间才能达到平衡状态进行测量。 安时积分法存在初始SOC的估算和累积的误差。 所以上述两种方法都存在一定的缺陷&#xff0c;因此下面主要讲…...

指针(下)

文章目录 指针(下)野指针、空指针野指针空指针 二级指针**main**函数的原型说明 常量指针与指针常量常量指针指针常量常量指针常量 动态内存分配常用函数**malloc****calloc****realloc****free** **void**与**void***的区别扩展&#xff1a;形式参数和实际参数的对应关系 指针…...

C# 浅谈IEnumerable

一、IEnumerable 简介 IEnumerable 是一个接口&#xff0c;它定义了对集合进行迭代所需的方法。IEnumerable 接口主要用于允许开发者使用foreach循环来遍历集合中的元素。这个接口定义了一个名为 GetEnumerator 的方法&#xff0c;该方法返回一个实现了 IEnumerator 接口的对象…...

mmdebstrap:创建 Debian 系统 chroot 环境的利器 ️

文章目录 mmdebstrap 的一般性参数说明 &#x1f4dc;mmdebstrap 的常见用法示例 &#x1f308;使用 mmdebstrap 的注意事项 ⚠️ &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界&#xff0c;能与您在此邂逅&#xff0c;真是缘分使然&am…...

【Linux SQLite数据库】一、SQLite交叉编译与移植

SQLite 是一个用 C 语言编写的开源、轻量级、快速、独立且高可靠性的 SQL 数据库引擎&#xff0c;它提供了功能齐全的数据库解决方案。SQLite 几乎可以在所有的手机和计算机上运行&#xff0c;它被嵌入到无数人每天都在使用的众多应用程序中。此外&#xff0c;SQLite 还具有稳定…...

每天写两道(数组篇)移除元素、

27.移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#…...

Unity 使用 NewtonSoft Json插件报错

JsonReaderException: Unexpected character encountered while parsing value: . Path , line 0, position 0. 通过断点发现&#xff0c;头有一串ZWNBSP&#xff0c;这个是BOM格式的JSON。在文件下看不到。 解决方法&#xff1a;改编码格式&#xff0c;Remove BOM....

k8s 部署 Mysqld_exporter 以及添加告警规则

最近监控 mysql 数据库&#xff0c;用了 pmm-server、pmm-client 发现监控是真的不太好用&#xff0c;还是用回 prometheus 吧。 部署mysqld_exporter k8s 部署最新版本的 mysqld_exporter&#xff0c;支持的数据库版本 MySQL >5.6、MariaDB > 10.3。 先在数据库创建用…...

基于STM32开发的智能农业环境监测系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 农田环境监测温室环境控制常见问题及解决方案 常见问题解决方案结论 1. 引言 智能农业环境监测系统通过集成多种环境传感器&#xff0c;实时监测土壤湿度、温度…...

【SQL】平均售价

目录 题目 分析 代码 题目 表&#xff1a;Prices ------------------------ | Column Name | Type | ------------------------ | product_id | int | | start_date | date | | end_date | date | | price | int | ---------------…...

存储器与CPU的连接

1.单块存储芯片与CPU的连接 单独的一块独立的存储芯片提供的线有&#xff1a;地址总线&#xff0c;数据总线&#xff0c;读写控制线&#xff0c;片选线&#xff0c;如果该存储器只有八根数据总线用于输出数据&#xff0c;而cpu一次可以读64位的数据呢&#xff1f; 我们可以将八…...

unity--webgl 访问本地index.html

目录 1:使用本地服务器 1.1 使用 Python 的 SimpleHTTPServer 1.2 使用 Node.js 的 http-server 2&#xff1a;让其他人通过 IP 地址来访问你的 Unity WebGL 项目 2.1: 确保服务器可访问 2.2 获取公共 IP 地址 2.3 配置本地服务器 1.使用 Python 的 SimpleHTTPServer 2…...

慢慢欣赏DPDK RTE_MAX_ETHPORTS的定义

DPDK代码里面&#xff0c;RTE_MAX_ETHPORTS是一个常见的宏定义&#xff0c;但是在.c和.h文件找不到其定义&#xff0c;在全文件搜索条件下&#xff0c;在config/meson.build找到这么一个定义 dpdk_conf.set(RTE_MAX_ETHPORTS, get_option(max_ethports)) 该宏定义是根据构建输…...

Java Nacos与Gateway的使用

Java系列文章目录 IDEA使用指南 Java泛型总结&#xff08;快速上手详解&#xff09; Java Lambda表达式总结&#xff08;快速上手详解&#xff09; Java Optional容器总结&#xff08;快速上手图解&#xff09; Java 自定义注解笔记总结&#xff08;油管&#xff09; Jav…...

前端项目中的Server-sent Events(SSE)项目实践及其与websocket的区别

前端项目中的Server-sent Events(SSE)项目实践 前言 在前端开发中&#xff0c;实时数据更新是提升用户体验的重要因素之一。Server-SentEvents(SSE)是一种高效的技术&#xff0c;允许服务器通过单向连接将实时数据推送到客户端。下面将从SSE的基本改变&#xff0c;使用场景展…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...