嵌入式——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. updatedelete不加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小型项目,一个文件就是数据库,不需要部署服务。

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

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

相关推荐
ACP广源盛139246256731 小时前
M6/M5 Pro Mac mini 端侧 AI 爆发@ACP#YLB3118 存储扩展芯片在本地 AI 服务中的机会与落地场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos
流浪0011 小时前
Linux系统篇26——通信(三)补:共享内存访问真的不进内核?
linux·运维·服务器
不会就选b1 小时前
Linux之socket编程(七)----序列化与反序列化(1)
java·linux·服务器
水饺编程1 小时前
第5章,[Win32 章节] :圆角矩形教学插图绘制程序
c语言·c++·windows·visual studio
隔窗听雨眠1 小时前
关系型数据库长期可维护性完全指南:设计、索引、运维、安全的系统性实践
数据库
是隼人1 小时前
buuctf-pwn PWN4(双引号的转义缺陷)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
码行山野赴时序归途1 小时前
C 语言文件操作完全指南:从打开到关闭
c语言·开发语言
涛思数据(TDengine)1 小时前
从“改了就改了“到“每一次变更都可追溯“:工业 AI 实战直播(十二期)
大数据·数据库·人工智能·时序数据库·tdengine
xixingzhe21 小时前
spring boot项目接口访问慢问题解决方案
java·数据库·spring boot