目录
- ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
- ❤️ 本篇创建记录 2022-11-08 ❤️
- ❤️ 本篇更新记录 2022-11-08 ❤️
- 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言 📝
- 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!
- 🔥 Arduino ESP8266教程累计帮助过超过1W+同学入门学习硬件网络编程,入选过选修课程,刊登过无线电杂志🔥
1. 前言
说到数据库,一般人肯定会想到MySQL。
但是MySQL占用内存太大
,部署在嵌入式设备中不一定是一个明智的选择。
SQLite是一个进程内的库,实现了自给自足
的、无服务器
的、零配置
的、事务性
的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置
。
就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接
。SQLite 直接访问其存储文件。
1.1 SQLite 官方说明
SQLite官网:https://www.sqlite.org/index.html
大概意思就是:
- SQLite是一个
C语言库
,它实现了一个小型、快速、自包含、高可靠性、全功能的SQL数据库引擎。SQLite是世界上使用最多的数据库引擎。SQLite内置于几乎所有的移动电话
和大多数计算机中,并捆绑在人们每天使用的无数其他应用程序中。- SQLite文件格式是稳定的、跨平台的、向后兼容的,开发人员保证至少在2050年以前保持这种格式。SQLite数据库文件通常用作在系统之间传输丰富内容的容器,并作为数据的长期存档格式。目前有超过1万亿(1 trillion)个SQLite数据库在使用中。
- SQLite源代码在公共域中,每个人都可以自由使用。
1.2 为什么要用 SQLite?
- 不需要一个单独的服务器进程或操作的系统(
无服务器
的) - SQLite 不需要配置,这意味着不需要安装或管理
- 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件
- SQLite 是
非常小
的,是轻量级
的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB - SQLite 是自给自足的,这意味着不需要任何外部的依赖
- SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问
- SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能
- SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API
- SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行
基于以上特点,非常适合在树莓派和其他嵌入式系统中使用。
2. 搭建sqlite环境
2.1 安装sqlite3
首先输入命令:
sudo apt-get update
sudo apt-get install sqlite3
再次输入命令:
sqlite3 -version
当前版本是 3.34.1版本。
2.2 创建或者打开数据库文件
SQLite是以文件形式
存在,一个数据库就是一个文件(db文件
)。
- 创建一个数据库存放目录
mkdir sqlite3
- 创建或者打开数据库文件
dpjcn.db
- sqlite3 dpjcn.db
在当前目录sqlite3下创建一个数据库文件dpjcn.db,同时挂载到SQLite3上,该文件将被 SQLite 引擎用作数据库
。
如果dpjcn.db已存在就打开并挂载这个文件。
这时候我们就可以使用sqlite对应的一些命令了。
2.3 创建表 —— create table语句
在我们的智能家居系统中有一些温度传感器,我们将这些温度传感器的数据存在这张表中。
- 创建表
create table temperature(
id INTEGER PRIMARY KEY,
deviceid varchar(20) default '0',
time varchar(20) default '0',
battery_voltage int default 0,
celsius_temp real default 0
);
- 查表temperature的结构
.schema temperature
总共有5个字段:
- id 自增
- deviceid 设备id,字符型
- time 时间,字符型
- battery_voltage 电量,int型,默认值0
- celsius_temp 温度,浮点型,默认值0
2.4 插入数据 —— insert 语句
直接输入:
insert into temperature (deviceid, time, battery_voltage, celsius_temp) values('temp001', '2020-07-28 17:25:35', 3451, 26.75);
insert into temperature (deviceid, time, battery_voltage, celsius_temp) values('temp001', '2020-07-28 17:25:45', 3454, 25.50);
insert into temperature (deviceid, time, battery_voltage, celsius_temp) values('temp001', '2020-07-28 17:25:55', 3453, 24.35);
2.5 查询数据 —— select 语句
- 查询所有记录
- 查询id = 2的记录
- 查询deviceid = temp001的第一条记录
2.6 修改数据 —— update 语句
查询id = 2的记录,将温度从25.5改成25.65
2.7 删除数据 —— delete 语句
- 删除id = 2的记录
- 删除所有记录
2.8 删除表 —— drop table 语句
2.9 退出SQLite —— .quit
3. 导出完整的数据库到文本文件sql —— .dump命令
可以在命令提示符中使用 SQLite .dump
点命令来导出完整的数据库在一个文本文件中,如下所示:
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE temperature(
id INTEGER PRIMARY KEY,
deviceid varchar(20) default '0',
time varchar(20) default '0',
battery_voltage int default 0,
celsius_temp real default 0
);
INSERT INTO temperature VALUES(1,'temp001','2020-07-28 17:25:35',3451,26.749999999999998223);
INSERT INTO temperature VALUES(2,'temp001','2020-07-28 17:25:45',3454,25.499999999999998223);
INSERT INTO temperature VALUES(3,'temp001','2020-07-28 17:25:55',3453,24.350000000000000532);
COMMIT;
这里就是一个sql执行语句,很多情况下我们可以在本地写好这个语句文件,然后直接导入到sqlite里面执行,不需要自己一个个字符输入。
4. 通过sql文件创建数据表和插入数据
-
删除表
drop table temperature
; -
通过简单的方式从生成的 dpjcn.sql 恢复
sqlite3 dpjcn.db < dpjcn.sql
通过这种sql文件的方式,我们可以把我们本地的数据直接复制一份给到其他设备。比如创建一个dpjcn.sh脚本:
#!/bin/sh
DBNAME="dpjcn.db"
rm -f $DBNAME
echo 开始插入数据
sqlite3 $DBNAME < dpjcn.sql
echo 插入完成
注意:
chmod a+x dpjcn.sh增加可执行权限
直接执行脚本试试。
5. 总结
sqlite非常适合在树莓派和其他嵌入式系统中使用,对于我们学习来说还是有必要学习一番,最好是结合sqlite语法来操作学习,后续结合服务器开发使用。