)
一、数据库基础概念1.1 普通文件 VS 数据库对比项普通文件 (txt/bin)SQLite3 数据库存储形式文本 / 二进制文件单 db 文件包含表、索引、数据增删改查需要自己代码解析效率低SQL 语句直接完成 CRUD内置索引查询高效数据组织自定义格式无规范二维表格关系模型并发访问需要自己做读写保护内置锁机制部署直接读写文件链接 sqlite3 库无后台服务进程普通文件适合简单少量数据当数据量大、频繁查询、条件筛选优先选用数据库。1.2 数据库分类1. 关系型数据库以二维表格存储数据- 大型Oracle、DB2- 中型MySQL、SQL Server- 小型嵌入式SQLite32. 非关系型数据库键值、文档存储- Redis内存键值数据库- MongoDB文档数据库1.3 SQLite3数据库特点1. 开源免费纯C语言开发代码量小库体积10M以内资源占用极低。2. 文件型数据库全部数据保存在一个xxx.db文件可以直接拷贝、迁移。3. 无服务进程应用程序直接调用sqlite3库访问数据库不需要启动后台数据库服务。4. 跨平台Linux、Windows、Android都可以使用。5. 最大支持2TB数据库文件满足嵌入式设备存储需求。缺点不适合高并发大量写入不支持网络远程访问只能本地访问。二、SQLite3命令行工具使用2.1 安装sqlite3bashUbuntu/Debiansudo apt-get install sqlite3sudo apt-get install libsqlite3-dev C语言开发库编译程序必须安装2.2 进入数据库命令行bashsqlite3 stu.db- 如果stu.db文件不存在sqlite3会自动创建数据库文件- 如果文件已经存在直接打开数据库。注意sqlite3命令行中以.开头是点命令工具内置不带分号SQL语句必须以分号;结尾。常用点命令sql.help -- 查看帮助.tables -- 查看数据库中所有表名.headers on -- 打开查询结果表头显示.mode column -- 格式化输出列对齐.quit -- 退出sqlite3命令行可视化工具- 命令行sqlite3- 图形工具sqlitebrowser可以打开db文件可视化查看表与数据bashsudo apt-get install sqlitebrowsersqlitebrowser stu.db三、SQLite3基础SQL语句SQLite数据类型- NULL空- INTEGER整型- REAL浮点- TEXT字符串文本- BLOB二进制原始数据3.1 创建数据表 CREATE TABLE语法sqlCREATE TABLE 表名(列名1 类型,列名2 类型,列名3 类型...);示例创建学生表sqlCREATE TABLE class1(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL);- PRIMARY KEY主键唯一标识一行记录- AUTOINCREMENT主键自动增长插入数据不用手动填写id。3.2 插入数据 INSERTsql--完整字段插入INSERT INTO class1(name,score) VALUES(zhangsan,88.5);--全部字段插入主键自增写NULLINSERT INTO class1 VALUES(NULL,lisi,92.0);TEXT字符串必须用双引号或者单引号包裹。3.3 查询数据 SELECTsql--查询表全部列全部数据SELECT FROM class1;--只查询name、score两列SELECT name,score FROM class1;--条件查询分数大于80SELECT FROM class1 WHERE score80;--多条件 and / orSELECT FROM class1 WHERE score60 AND score90;--模糊匹配 %匹配任意多个字符_匹配单个字符SELECT FROM class1 WHERE name LIKE zhang%;--排序ASC升序DESC降序SELECT FROM class1 ORDER BY score DESC;3.4 修改数据 UPDATEsqlUPDATE class1 SET score95 WHERE id1;不加WHERE条件会修改表里面全部记录开发务必小心。3.5 删除数据 DELETEsqlDELETE FROM class1 WHERE id2;不加WHERE条件会删除整张表全部数据。3.6 删除表 DROP TABLEsqlDROP TABLE class1;四、SQLite3 C语言API编程编译注意使用sqlite3的C代码编译时需要链接sqlite库gcc main.c -o app -lsqlite34.1 核心API总览函数功能sqlite3_open()打开 / 创建数据库获取数据库句柄sqlite3_errmsg()获取错误信息字符串sqlite3_exec()执行 SQL 语句支持回调函数处理查询结果sqlite3_close()关闭数据库释放资源1sqlite3_open 打开数据库include sqlite3.hint sqlite3_open(const char filename, sqlite3 ppDb);- filename数据库文件路径如./stu.db文件不存在自动创建- ppDb输出参数数据库句柄指针后续所有操作都使用这个句柄- 返回值成功返回SQLITE_OK(0)失败返回非0错误码。打开数据库不等于打开文件sqlite内部会处理表、索引。2sqlite3_close 关闭数据库int sqlite3_close(sqlite3 pDb);用完数据库一定要close释放资源。3sqlite3_errmsg 获取错误信息const char sqlite3_errmsg(sqlite3 pdb);传入数据库句柄返回错误描述字符串方便打印调试。4sqlite3_exec最重要执行SQL语句int sqlite3_exec(sqlite3 pdb, //数据库句柄const char sql, //要执行的SQL字符串int (callback)(void,int,char,char), //查询回调函数void arg, //传递给回调函数的自定义参数char errmsg //输出错误信息);关键点1. 增、删、改INSERT / UPDATE / DELETE没有返回结果集callback填NULL2. SELECT查询语句必须传入回调函数查询到每一行记录就会调用一次callback回调3. 返回值成功返回SQLITE_OK失败非0。查询回调函数原型int callback(void arg, int n, char value, char name);- argsqlite3_exec传入的第四个参数- n当前这一行有多少列- value[]字符串数组保存这一行每一列的数据- name[]字符串数组保存每一列的表头字段名- 返回值必须返回0返回非0会终止查询。4.2 完整C语言示例代码include stdio.hinclude sqlite3.hinclude string.h/ 查询回调函数 /int sql_callback(void arg, int col_cnt, char col_val, char col_name){//打印一行数据for(int i 0; i col_cnt; i){printf(%s %s\t, col_name[i], col_val[i]?col_val[i]:NULL);}printf(\n);return 0;}int main(void){sqlite3 db;char errmsg NULL;int ret;//1.打开数据库不存在则创建ret sqlite3_open(./stu.db, db);if(ret ! SQLITE_OK){printf(打开数据库失败%s\n, sqlite3_errmsg(db));return -1;}printf(数据库打开成功\n);//2.创建表char sql_create CREATE TABLE IF NOT EXISTS class1(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL);;ret sqlite3_exec(db, sql_create, NULL, NULL, errmsg);if(ret ! SQLITE_OK){printf(建表失败%s\n, errmsg);sqlite3_free(errmsg);}//3.插入数据char sql_insert INSERT INTO class1(name,score) VALUES(zhangsan,88.5);;ret sqlite3_exec(db, sql_insert, NULL, NULL, errmsg);if(ret ! SQLITE_OK){printf(插入失败%s\n, errmsg);sqlite3_free(errmsg);}//4.查询数据传入回调函数接收结果char sql_select SELECT FROM class1;;printf(查询结果\n);ret sqlite3_exec(db, sql_select, sql_callback, NULL, errmsg);if(ret ! SQLITE_OK){printf(查询失败%s\n, errmsg);sqlite3_free(errmsg);}//5.关闭数据库sqlite3_close(db);return 0;}编译命令bashgcc sqlite_demo.c -o sqlite_demo -lsqlite3./sqlite_demo五、常见开发注意事项1. SQL注入风险不要直接用sprintf拼接外部输入内容到SQL语句正式项目建议使用预处理接口sqlite3_prepare_v2。2. errmsg内存sqlite3_exec输出的errmsg出错后需要调用sqlite3_free(errmsg)释放避免内存泄漏。3. 回调函数SELECT查询每一行调用一次回调回调函数必须返回0否则查询直接中断。4. SQLite3写锁SQLite数据库文件写的时候会加文件锁多进程同时写会阻塞或者报错。5. 数据库文件权限嵌入式开发注意db文件的读写权限否则打开失败。小结1. SQLite3是嵌入式Linux首选轻量级关系数据库单文件、无后台服务、C语言开发、资源占用低适合设备本地存储。2. 掌握命令行工具sqlite3熟悉点命令.tables .headers on .mode column .quit。3. 基础SQLCREATE建表、INSERT插入、SELECT查询、UPDATE修改、DELETE删除、DROP删除表。4. C语言核心APIsqlite3_open打开数据库sqlite3_exec执行SQL查询要注册callback回调sqlite3_close关闭数据库。5. 编译程序必须链接-lsqlite3开发注意内存释放、SQL注入、文件锁问题。