嵌入式——Linux软件编程——数据库

Linux C开发学习博客|4.6 SQLite数据库

今日学习:SQLite轻量级数据库,命令行操作 + C语言API编程

📖学习总结

SQLite是一款文件型轻量级关系型数据库,不需要独立数据库服务进程,整个数据库就保存在一个磁盘文件,非常适合嵌入式、小型Linux C程序开发。

学习分为两大部分:

  1. sqlite3交互式命令行工具

    • .开头是sqlite工具专属点命令,用来查看表、打开表头显示、查看表结构;
    • 标准SQL语句,以分号;结尾,完成建表create table、插入insert、查询select、更新update、删除delete、排序order by、多表联查。
    • 支持4种数据类型:INTEGER整型、REAL浮点、TEXT文本字符串、BLOB二进制原始字节。
  2. C语言调用SQLite库API

    • sqlite3_open():打开/创建数据库文件,得到数据库句柄sqlite3*;
    • sqlite3_exec():核心函数,执行SQL。执行select查询必须依赖回调函数获取每一行查询结果;增删改不需要回调;
    • sqlite3_close():关闭数据库句柄,释放资源;
    • 编译时必须链接sqlite库:gcc xxx.c -o xxx -lsqlite3。

对比普通文件读写:文件需要自己解析字符串、分割字段、写查找逻辑;数据库内置索引、条件过滤、多表关联,直接写SQL就能完成复杂的数据检索。

🔥重点

  1. 数据库分类
    • 关系型:Oracle、MySQL、SQLite,以二维表格组织数据,存磁盘文件;
    • 非关系型:Redis,主要存内存。
  2. 安装命令:sudo apt‑get install sqlite3
  3. SQLite点命令(只能在交互式终端,不能写到C语言sqlite3_exec中 )
    • .tables:查看数据库内全部表;
    • .schema 表名:查看建表语句、表结构;
    • .headers on:开启查询时显示列名;
    • .mode 设置输出显示格式。
  4. 核心SQL语法
    • create table 表名(字段 类型,...); 创建数据表;
    • insert into 表 values(...) / 指定字段插入 insert into 表(字段1,字段2) values(...);
    • select * from 表 where 条件,where做条件过滤;
    • update 表 set 字段=值 where 条件 更新记录;
    • delete from 表 where 条件 删除记录;
    • order by 字段 asc/desc 升序/降序;
    • 多表查询:cross join交叉连接、inner join内连接、left outer join左外连接,使用on指定关联条件。
  5. C语言三大核心API
    • sqlite3_open(filename, &ppDb) 打开数据库;
    • sqlite3_exec(db, sql, callback, arg, &errmsg) 执行SQL;
    • sqlite3_close(db) 关闭数据库。
  6. 回调函数原型 :int (*callback)(void* arg,int argc,char** argv,char** azColName)
    • argc:当前行的列数;
    • argv[]:每一列数据值;
    • azColName[]:每一列字段名。

⚠️难点

  1. 回调函数理解 :sqlite3_exec执行select查询,数据库每读出一行数据,就调用一次回调函数。回调是C语言操作SQLite最大难点,要搞清楚谁调用回调、三个参数分别代表什么。
  2. 多表联合查询 :区分交叉、内连接、左外连接;必须写on关联条件,否则产生笛卡尔积,输出大量无效数据。
  3. C语言拼接SQL字符串:文本字段字符串必须加双引号,拼接字符串极易产生语法错误;
  4. 区分点命令和SQL语句 :.tables这类点命令只能交互式shell执行,不能作为sql参数传给sqlite3_exec。
  5. 编译链接:忘记加‑lsqlite3编译选项,报函数未定义。

❌易错点

  1. update、delete不加where条件,整张表全部修改/删除,数据直接丢失 。修改删除前建议先用select where验证条件是否正确。
  2. SQL语句末尾分号;命令行交互式必须写;C语言传入sqlite3_exec的SQL字符串建议带上分号。
  3. TEXT字符串字段值必须加引号,INTEGER数字不要加引号。
  4. 混淆点命令与SQL,试图把.tables写进C代码执行,执行报错。
  5. 回调函数参数顺序搞混:argv存值,azColName存列名。
  6. 使用结束忘记调用sqlite3_close(),数据库句柄泄露。
  7. 打开数据库错误,没有判断sqlite3_open()返回值,直接使用空的数据库句柄。
  8. 多表联查不写on条件,出现笛卡尔积,数据结果错乱。
  9. 编译忘记链接库:gcc test.c -o test -lsqlite3,少写‑lsqlite3链接失败。

💡学习感悟

SQLite非常适合嵌入式Linux小型项目,一个文件就是数据库,不需要部署服务。

安全提示:delete、update操作风险很高,优先select校验where条件,再执行修改删除 。

C语言开发重点吃透回调函数,所有select查询的结果全部靠回调函数返回给应用程序。

相关推荐
运维全世界几秒前
Slurm集群搭建实战踩坑:存储节点无RAID、跨节点GPU无法读取数据彻底解决
linux
Nturmoils2 分钟前
数据集成软件 KFS:多套业务库汇聚时,先把来源和口径理清
数据库
帷幕落秋3 分钟前
进程服务与文件描述符
linux·运维·面试
用户209583592304 分钟前
谛听(Diting)开发W7:检出率从 27% 到 100%,规则包从 19 条扩到 27 条
linux
帷幕落秋7 分钟前
信号、Ctrl 组合键与进程状态
linux·运维·面试
麦壳饼10 分钟前
SonnetDB:批量写入的大小、背压与刷新策略
数据库·sonnetdb
大能嘚吧嘚16 分钟前
Debian13系统安装
linux
qetfw22 分钟前
grep 文本筛选:匹配、反选与退出状态验证
linux·shell
就像楞次定律29 分钟前
【Linux 学习记之一】日常生产力工具与终端流的高效闭环实践(1)
linux
奔跑的架构师29 分钟前
[A-51]ARMv9/v8-SCMI系统架构
linux·arm开发·架构·系统架构·arm