1. 创建 / 打开数据库
SQLite3 的数据库是单文件 存储,sqlite3命令后紧跟文件名即可实现 "不存在则创建、存在则打开",这是嵌入式场景的核心特性(无需配置服务,直接操作文件)。
打开终端,执行以下命令创建 / 打开名为embedded_db.db的数据库:
bash
sqlite3 embedded_db.db
执行后终端会进入sqlite>提示符,说明已成功打开 / 创建该数据库文件。
SQLite3 仅执行sqlite3 embedded_db.db时不会立即创建空文件,只有执行CREATE TABLE等实际写入操作后才生成文件,这是 SQLite3 的延迟写入特性,能最大程度节省嵌入式设备的存储资源。
2. 创建 / 删除数据表
2.1 创建数据表
数据表是存储数据的核心载体,嵌入式场景中常用 "设备参数 / 传感器数据 / 日志" 等表,以下是贴合嵌入式的表结构设计。
表结构设计(嵌入式设备参数表device_params)
| 字段名 | 类型 | 约束 | 嵌入式场景含义 |
|---|---|---|---|
| id | INTEGER | PRIMARY KEY AUTOINCREMENT | 自增主键(唯一标识每条记录,便于查询 / 修改) |
| param_name | TEXT | NOT NULL | 参数名(如 temp / 湿度 / 电压,非空避免无效数据) |
| param_value | REAL | NOT NULL | 参数值(REAL 支持浮点,适配传感器数据) |
| update_ts | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 更新时间戳(自动记录数据修改时间,便于溯源) |
SQL 语法详解
sql
-- 创建表的核心语法:CREATE TABLE IF NOT EXISTS 表名 (字段1 类型 约束, 字段2 类型 约束,...);
-- 关键语法点:
-- 1. IF NOT EXISTS:避免重复创建表报错(嵌入式程序重启时很重要)
-- 2. PRIMARY KEY:主键,保证记录唯一性
-- 3. AUTOINCREMENT:整数主键自增(嵌入式中无需手动维护ID)
-- 4. NOT NULL:字段不能为空,避免无效数据
-- 5. DEFAULT CURRENT_TIMESTAMP:默认值为当前时间,无需手动插入
CREATE TABLE IF NOT EXISTS device_params (
id INTEGER PRIMARY KEY AUTOINCREMENT,
param_name TEXT NOT NULL,
param_value REAL NOT NULL,
update_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
操作步骤
-
在
sqlite>提示符下,输入上述完整的 CREATE TABLE 语句,执行后按回车。 -
验证表是否创建成功:执行以下命令查看数据库中的表列表:
sql
.tables
输出包含device_params,证明表创建成功。
- 查看表结构(验证字段和约束):
sql
PRAGMA table_info(device_params);
会输出表的字段列表、类型、约束等信息,可核对是否和设计一致。
sql
0|id|INTEGER|0||1
1|param_name|TEXT|1||0
2|param_value|REAL|1||0
3|update_ts|TIMESTAMP|0|CURRENT_TIMESTAMP|0
2.2 删除数据表
删除数据表的核心 SQL 语法是DROP TABLE,嵌入式场景中必须掌握两个关键参数:
| 语法 | 作用 | 嵌入式场景价值 |
|---|---|---|
DROP TABLE 表名; |
删除指定数据表(表不存在则报错) | 仅调试场景用,嵌入式中易导致程序崩溃 |
DROP TABLE IF EXISTS 表名; |
删除表(表不存在则无操作,不报错) | 嵌入式首选,程序重启 / 初始化时避免报错 |
注意 :DROP TABLE会永久删除表结构 + 所有数据,且嵌入式设备无回收站 / 日志回滚,数据删除后不可恢复(除非提前备份)。
场景 1:安全删除(推荐,嵌入式调试 / 初始化用)
用IF EXISTS避免表不存在时报错,步骤如下:
sql
-- 1. 打开数据库
sqlite3 embedded_db.db
-- 2. (可选)先查看当前所有表,确认要删除的表存在
sqlite> .tables
-- 输出:device_params(确认表名)
-- 3. 安全删除表(IF EXISTS是嵌入式核心)
sqlite> DROP TABLE IF EXISTS device_params;
-- 4. 验证删除结果
sqlite> .tables
-- 输出为空,说明表已删除
场景 2:普通删除(表不存在则报错,嵌入式禁止)
仅用于确认表一定存在的调试场景:
sql
sqlite> DROP TABLE device_params;
-- 若表不存在,会报错:Error: no such table: device_params(嵌入式中会导致程序异常)
3. 插入(INSERT)+ 查询(SELECT)数据
3.1 插入数据(INSERT)
嵌入式场景中,INSERT 用于将传感器数据、设备电压 / 电流等参数写入数据库,以下是适配嵌入式的语法和操作。
INSERT 语法详解(两种方式,嵌入式优先选方式 1)
| 方式 | 语法 | 嵌入式场景优势 |
|---|---|---|
| 方式 1(指定字段) | INSERT INTO 表名 (字段1, 字段2) VALUES (值1, 值2); |
字段顺序变动时不报错,嵌入式程序迭代更健壮 |
| 方式 2(不指定字段) | INSERT INTO 表名 VALUES (值1, 值2, 值3, 值4); |
代码短,但依赖字段顺序,嵌入式中易出错,不推荐 |
关键注意点:
param_name是 TEXT 类型,值必须用单引号包裹;param_value是 REAL 类型(浮点),直接写数值即可;id是自增主键、update_ts有默认时间戳,无需手动赋值(写 NULL 会自动填充)。
操作步骤(在sqlite>提示符下逐行执行)
- 执行方式 1 的 3 条插入语句(温度、湿度、电压):
sql
INSERT INTO device_params (param_name, param_value) VALUES ('temp', 25.5);
INSERT INTO device_params (param_name, param_value) VALUES ('humidity', 60.2);
INSERT INTO device_params (param_name, param_value) VALUES ('voltage', 3.32);
- 执行方式 2 的 1 条插入语句(电流,仅作对比):
sql
INSERT INTO device_params VALUES (NULL, 'current', 0.85, CURRENT_TIMESTAMP);
3.2 查询数据(SELECT)
SELECT 是嵌入式中读取数据的核心,支持 "全量查(调试)"、"指定字段查(省内存)"、"条件查(精准读)",完全适配嵌入式设备内存有限的特点。
SELECT 语法详解(3 种嵌入式常用场景)
| 场景 | 语法 | 嵌入式使用场景 |
|---|---|---|
| 全量查询 | SELECT * FROM device_params; |
开发调试阶段,查看所有数据 |
| 指定字段查询 | SELECT param_name, param_value FROM device_params; |
运行阶段,只读取需要的字段,减少内存占用 |
| 条件查询 | SELECT param_value FROM device_params WHERE param_name = 'temp'; |
精准读取某一个参数(如仅读温度),嵌入式最常用 |
操作步骤(在sqlite>提示符下执行)
- 全量查询(验证插入是否成功):
sql
SELECT * FROM device_params;
输出如下:
sql
1|temp|25.5|2026-01-26 10:15:46
2|humidity|60.2|2026-01-26 10:15:46
3|voltage|3.32|2026-01-26 10:15:46
4|current|0.85|2026-01-26 10:15:50
- 指定字段查询(模拟嵌入式运行时的轻量读取):
sql
SELECT param_name, param_value FROM device_params;
输出如下:
sql
temp|25.5
humidity|60.2
voltage|3.32
current|0.85
- 条件查询(精准读取温度值):
sql
SELECT param_value FROM device_params WHERE param_name = 'temp';
输出如下:
sql
25.5
- 拓展条件查询(读取值大于 10 的参数):
sql
SELECT * FROM device_params WHERE param_value > 10;
输出如下:
sql
1|temp|25.5|2026-01-26 10:15:46
2|humidity|60.2|2026-01-26 10:15:46
4. 更新(UPDATE)+ 删除(DELETE)数据
4.1 更新数据(UPDATE
嵌入式场景中,UPDATE 用于实时更新传感器数据(比如温度从 25.5 变为 26.0)、校准参数等,核心是必须加 WHERE 条件,否则会更新全表数据。
UPDATE 语法详解(嵌入式必加 WHERE)
sql
-- 核心语法:UPDATE 表名 SET 字段1=新值1, 字段2=新值2 WHERE 条件;
-- 关键注意点:
-- 1. WHERE条件:嵌入式中必须加,避免误改全表(比如只改temp的value,不改其他参数)
-- 2. 可同时更新多个字段:比如改value+手动更新时间戳
-- 3. 条件可基于param_name(嵌入式常用)或id
操作步骤(在sqlite>提示符下执行)
- 更新温度值(从 25.5→26.0,嵌入式场景:传感器新读数):
sql
UPDATE device_params SET param_value = 26.0 WHERE param_name = 'temp';
- 验证更新结果(核对 temp 值):
sql
SELECT param_value FROM device_params WHERE param_name = 'temp';
输出如下:
sql
26.0
4.2 删除数据(DELETE)
嵌入式设备存储有限,DELETE 用于清理无效 / 过期参数(比如超过 7 天的日志),同样必须加 WHERE 条件,否则会删除全表数据。
DELETE 语法详解(嵌入式必加 WHERE)
sql
-- 核心语法:DELETE FROM 表名 WHERE 条件;
-- 关键注意点:
-- 1. WHERE条件:嵌入式中绝对不能省略,否则全表数据被删
-- 2. 条件可基于param_name/id/时间戳(嵌入式常用按时间删)
-- 3. 嵌入式中删除后数据不可恢复,需谨慎
操作步骤(请在sqlite>提示符下执行)
- 删除 current 参数(模拟清理无用的电流数据):
sql
DELETE FROM device_params WHERE param_name = 'current';
- 验证删除结果(全量查询,确认 current 记录消失):
sql
SELECT * FROM device_params;
输出如下:
sql
1|temp|26.0|2026-01-26 10:15:46
2|humidity|60.2|2026-01-26 10:15:46
3|voltage|3.32|2026-01-26 10:15:46
- 拓展:删除值小于 5 的参数(模拟清理无效的电压数据):
sql
DELETE FROM device_params WHERE param_value < 5;
- 最终验证(全量查询,确认只剩 temp 和 humidity):
sql
SELECT * FROM device_params;
输出如下:
sql
1|temp|26.0|2026-01-26 10:15:46
2|humidity|60.2|2026-01-26 10:15:46