当前位置: 首页 > 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;使用场景展…...

《老俞闲话|唯爱和热情不可辜负》读后感

《老俞闲话&#xff5c;唯爱和热情不可辜负》读后感 俞敏洪先生的这篇讲话充满了深情与智慧&#xff0c;他以自己丰富的人生经历和教育实践&#xff0c;向我们展现了一位教育家对于教育事业的热爱和对教师角色的深刻理解。 情感真挚&#xff0c;触动人心 俞敏洪先生的讲话中流…...

C语言 ——— 在杨氏矩阵中查找具体的某个数

目录 何为杨氏矩阵 题目要求 代码实现 何为杨氏矩阵 可以把杨氏矩阵理解为一个二维数组&#xff0c;这个二维数组中的每一行从左到右是递增的&#xff0c;每一列从上到下是递增的 题目要求 在杨氏矩阵中查找具体的某个数 要求&#xff1a;时间复杂度小于O(N) 代码实现…...

DAI-Net: 基于对偶自适应交互网络的药物推荐算法

引言 DAI-Net: Dual Adaptive Interaction Network for Coordinated Medication Recommendation 论文链接&#xff1a;https://ieeexplore.ieee.org/document/10614809 代码链接&#xff1a;GitHub - obananas/DAI-Net 在现代医疗保健中&#xff0c;如何利用电子健康记录&a…...

haproxy高级功能及配置

章节 一、haproxy 基础用法 二、haproxy 高级用法 三、haproxy之ACL的使用 目录 1 基于cookie的会话保持 1.1 cookie命名&#xff0c;并赋予其值 1.2 验证cookie信息 1.2.1 Windows浏览器验证 1.2.2 Linux下虚拟机验证 2 IP透传 2.1 四层与七层透传的区别 2.2 七层IP透传 2.2…...

【前端】NodeJS:记账本案例优化(MongoDB数据库)

文章目录 1 字符串转为时间对象——Moment2 记账本实例优化 1 字符串转为时间对象——Moment Moment.js中文网&#xff1a;https://momentjs.cn/docs/#/parsing/。 npm install moment // 安装moment var moment require(moment); // require moment().format(); 2 记账本实…...

Padding Mask;Sequence Mask;为什么如果没有适当的掩码机制,解码器在生成某个位置的输出时,可能会“看到”并错误地利用该位置之后的信息

目录 掩码Mask Padding Mask Sequence Mask 为什么需要Sequence Mask? Sequence Mask是如何工作的? 具体实现 为什么如果没有适当的掩码机制,解码器在生成某个位置的输出时,可能会“看到”并错误地利用该位置之后的信息 自回归性质 一、定义 二、性质 三、应用限制…...

派森学长带你学python—字典

一.字典的创建与删除 字典类型是根据一个信息查找另一个信息的方式构成了键值对 字典和列表均为可变数据类型&#xff0c;可变数据类型具有增删改等操作 字典中的键唯一&#xff0c;值可以有多个相同的&#xff1b;字典中的键要求是不可变序列&#xff0c;如字符串、整数、浮…...

如何设置 Visual Studio Code 的滚轮缩放功能

Visual Studio Code (VSCode) 是一个强大的代码编辑器&#xff0c;提供了许多便捷的功能来提高开发效率。其中之一就是通过滚轮缩放字体大小。以下是详细的设置步骤&#xff1a; 步骤 1&#xff1a;打开设置页面 首先&#xff0c;启动 Visual Studio Code。在左上角点击 “文…...

Python模拟退火算法

目录 模拟退火算法简介模拟退火算法的步骤模拟退火算法的Python实现场景&#xff1a;函数优化问题 代码解释总结 模拟退火算法简介 模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种基于物理退火过程的随机搜索算法&#xff0c;用于寻找全局最优解。其灵感…...

C语言典型例题36

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题3.4 输入一个字符&#xff0c;判别它是否为大写字母&#xff0c;如果是&#xff0c;将它转换为小写字母&#xff1a;如果不是&#xff0c;不转换。然后输出最后要输出的字符。 代码&#xff1a; //《C程序设计…...