Linux C开发学习博客|4.6 SQLite数据库
今日学习:SQLite轻量级数据库,命令行操作 + C语言API编程
📖学习总结
SQLite是一款文件型轻量级关系型数据库,不需要独立数据库服务进程,整个数据库就保存在一个磁盘文件,非常适合嵌入式、小型Linux C程序开发。
学习分为两大部分:
-
sqlite3交互式命令行工具
.开头是sqlite工具专属点命令,用来查看表、打开表头显示、查看表结构;- 标准SQL语句,以分号
;结尾,完成建表create table、插入insert、查询select、更新update、删除delete、排序order by、多表联查。 - 支持4种数据类型:
INTEGER整型、REAL浮点、TEXT文本字符串、BLOB二进制原始字节。
-
C语言调用SQLite库API
sqlite3_open():打开/创建数据库文件,得到数据库句柄sqlite3*;sqlite3_exec():核心函数,执行SQL。执行select查询必须依赖回调函数获取每一行查询结果;增删改不需要回调;sqlite3_close():关闭数据库句柄,释放资源;- 编译时必须链接sqlite库:
gcc xxx.c -o xxx -lsqlite3。
对比普通文件读写:文件需要自己解析字符串、分割字段、写查找逻辑;数据库内置索引、条件过滤、多表关联,直接写SQL就能完成复杂的数据检索。
🔥重点
- 数据库分类
- 关系型:Oracle、MySQL、SQLite,以二维表格组织数据,存磁盘文件;
- 非关系型:Redis,主要存内存。
- 安装命令:
sudo apt‑get install sqlite3 - SQLite点命令(只能在交互式终端,不能写到C语言sqlite3_exec中 )
.tables:查看数据库内全部表;.schema 表名:查看建表语句、表结构;.headers on:开启查询时显示列名;.mode设置输出显示格式。
- 核心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指定关联条件。
- C语言三大核心API
sqlite3_open(filename, &ppDb)打开数据库;sqlite3_exec(db, sql, callback, arg, &errmsg)执行SQL;sqlite3_close(db)关闭数据库。
- 回调函数原型 :
int (*callback)(void* arg,int argc,char** argv,char** azColName)argc:当前行的列数;argv[]:每一列数据值;azColName[]:每一列字段名。
⚠️难点
- 回调函数理解 :
sqlite3_exec执行select查询,数据库每读出一行数据,就调用一次回调函数。回调是C语言操作SQLite最大难点,要搞清楚谁调用回调、三个参数分别代表什么。 - 多表联合查询 :区分交叉、内连接、左外连接;必须写
on关联条件,否则产生笛卡尔积,输出大量无效数据。 - C语言拼接SQL字符串:文本字段字符串必须加双引号,拼接字符串极易产生语法错误;
- 区分点命令和SQL语句 :
.tables这类点命令只能交互式shell执行,不能作为sql参数传给sqlite3_exec。 - 编译链接:忘记加
‑lsqlite3编译选项,报函数未定义。
❌易错点
update、delete不加where条件,整张表全部修改/删除,数据直接丢失 。修改删除前建议先用select where验证条件是否正确。- SQL语句末尾分号;命令行交互式必须写;C语言传入sqlite3_exec的SQL字符串建议带上分号。
- TEXT字符串字段值必须加引号,INTEGER数字不要加引号。
- 混淆点命令与SQL,试图把
.tables写进C代码执行,执行报错。 - 回调函数参数顺序搞混:
argv存值,azColName存列名。 - 使用结束忘记调用
sqlite3_close(),数据库句柄泄露。 - 打开数据库错误,没有判断
sqlite3_open()返回值,直接使用空的数据库句柄。 - 多表联查不写
on条件,出现笛卡尔积,数据结果错乱。 - 编译忘记链接库:
gcc test.c -o test -lsqlite3,少写‑lsqlite3链接失败。
💡学习感悟
SQLite非常适合嵌入式Linux小型项目,一个文件就是数据库,不需要部署服务。
安全提示:
delete、update操作风险很高,优先select校验where条件,再执行修改删除 。C语言开发重点吃透回调函数,所有select查询的结果全部靠回调函数返回给应用程序。