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

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...