【AI大模型接入SDK】SQLite数据库基础概述
《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》
🎬 艾莉丝的简介:

文章目录

1 ~> SQLite 数据库基础概述
1.1 SQLite 核心定义与特性
- SQLite 是开源、轻量级、零配置、无服务器、自包含、事务性、支持标准 SQL、跨平台的关系型数据库引擎,以 C 库形式实现,源代码无版权限制。
- 核心特性
- 轻量级:编译后库文件仅数百 KB,资源占用极低。
- 无服务器:不存在独立后台服务进程,应用程序直接调用库函数读写磁盘数据库文件。
- 零配置:无需安装、启停、配置数据库服务。
- 自包含:全部数据库内容(表、索引、元数据、数据)存放在**单个****
.db**后缀磁盘文件,文件跨操作系统平台。 - 事务性:完整支持 ACID(原子性、一致性、隔离性、持久性),断电、程序崩溃场景保障数据完整性。
- 标准 SQL 支持:兼容绝大多数标准 SQL 语法,数据库最大支持 128TB。
- 跨平台:Windows、Linux、macOS、嵌入式设备、移动端均可运行。
- 典型适用场景
- 嵌入式设备、移动端应用、本地桌面程序。
- SDK 类项目:交付给终端用户使用,避免用户额外安装配置 MySQL 等数据库服务。
- 与 MySQL 对比
- MySQL:C/S 架构,独立数据库服务进程;需要安装配置;适合高并发、复杂业务的服务端业务;用户部署成本高。
- SQLite:本地库文件,无服务进程;零配置;适合本地持久化存储,不适合高并发写场景;用户部署成本极低。
1.2 持久化存储背景
- 内存属于易失性存储,断电、程序重启后内存内数据全部丢失。
- 业务场景:聊天会话、历史对话记录必须持久化到磁盘,保障程序重启后数据不丢失。
- SQLite 方案优势:SDK 交付场景,只需要链接库文件,终端用户不需要额外部署数据库环境。
2 ~> Ubuntu 环境 SQLite 环境部署
2.1 软件包说明
sqlite3:SQLite 命令行交互工具,用于终端直接操作数据库。libsqlite3-dev:SQLite 开发库,提供头文件sqlite3.h、静态库libsqlite3.a、动态库libsqlite3.so,用于 C/C++ 代码开发。
2.2 安装命令
# 安装sqlite3命令行交互工具
sudo apt install sqlite3
# 安装SQLite开发库,代码编译必须依赖
sudo apt install libsqlite3-dev
# 查看开发包安装的全部文件与路径
dpkg -L libsqlite3-dev
2.3 关键安装路径
- 头文件目录:
/usr/include/sqlite3.h主头文件sqlite3ext.h扩展头文件
- 库文件目录:
/usr/lib/x86_64-linux-gnu/libsqlite3.a:静态库libsqlite3.so:动态库
2.4 编译链接配置
2.4.1 Makefile
# 编译时使用-lsqlite3链接SQLite库
g++ main.cpp -o my_program -lsqlite3
2.4.2 CMakeLists.txt
# 为目标程序链接sqlite3库
target_link_libraries(${SDK_NAME} sqlite3)
2.5 版本查看
sqlite3 --version
3 ~> SQLite 终端命令行操作
注意:SQLite 分为点命令(以****
.**开头,sqlite 内置元命令,不是 SQL 标准语句) 和标准 SQL 语句**。SQL 语句必须以分号;结尾,点命令不能带分号。
3.1 启动命令行程序
sqlite3
- 不指定数据库文件启动:默认连接内存临时数据库,退出之后所有数据全部丢失。
- 使用
.open 数据库名.db打开 / 创建磁盘持久化数据库文件。文件不存在则自动创建。
3.2 数据库相关点命令
| 命令 | 功能说明 | 使用示例 |
|---|---|---|
.open 文件名 | 打开或者创建数据库文件 | .open studentDB.db |
.databases | 显示当前所有已经挂载连接的数据库 | .databases |
.attach 文件 as 别名 | 附加挂载另外一个数据库文件 | .attach archive.db as archive |
.backup 文件名 | 将当前数据库备份到指定文件 | .backup backup.db |
.restore 文件名 | 从备份文件恢复数据库 | .restore recovery.db |
.quit / .exit | 退出 sqlite3 终端程序 | .quit |
.help | 查看全部内置点命令帮助 | .help |
.version | 打印 SQLite 版本信息 | .version |
3.3 表与结构相关点命令
| 命令 | 功能说明 | 使用示例 |
|---|---|---|
.tables | 列出当前数据库全部数据表 | .tables |
.schema [表名] | 打印建表 SQL 语句,查看表结构 | .schema student |
.indexes [表名] | 查看数据表索引 | .indexes student |
.headers on | 开启查询结果表头显示 | .headers on |
.mode column | 设置输出格式为对齐表格模式 | .mode column |
3.4 终端完整实操示例
-- 打开/创建磁盘数据库studentDB.db
.open studentDB.db
-- 查看当前挂载数据库
.databases
-- 创建student学生表
CREATE TABLE student(
stuid INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
score REAL
);
-- 查看数据库所有表
.tables
-- 查看student表建表结构
.schema student
-- 批量插入学生数据
INSERT INTO student(name,age,score)
VALUES
('张三',18,92.0),
('李四',19,93.5),
('王五',18,76.5);
-- 查询全部学生数据
SELECT * FROM student;
-- 删除分数小于80分的学生
DELETE FROM student WHERE score < 80;
-- 再次查询验证删除结果
SELECT * FROM student;
-- 退出sqlite终端
.quit
4 ~> SQLite 数据类型体系
SQLite 采用动态类型系统:值的数据类型依附于存储的值本身,而不是依附于表列(容器)。同一个列可以存放不同存储类的数据。 两个核心概念:存储类、列亲和类型 (Affinity)。
4.1 存储类(磁盘真实存储格式)
存储类代表数据在磁盘上物理存储的真实类型,一共 5 种:
| 存储类 | 描述 |
|---|---|
| NULL | 空值 |
| INTEGER | 有符号整数,根据数值大小占用 1/2/3/4/6/8 字节 |
| REAL | 8 字节 IEEE 双精度浮点数字 |
| TEXT | UTF‑8 / UTF‑16BE / UTF‑16LE 编码文本字符串 |
| BLOB | 原始二进制数据,原样输入原样存储,不做任何转换 |
4.2 亲和类型(Affinity,列存储偏好)
- 亲和类型是列的存储偏好建议,不是强制约束。
- 插入数据时,SQLite 结合输入原始数据 + 列亲和类型规则,自动转换选择最终使用的存储类。
- 即使定义 INT 列,依然可以插入字符串;定义 TEXT 列也可以插入数字。数据库会按照亲和规则尝试转换,转换失败则保留原始存储类。
4.2.1 五种亲和类型规则
- TEXT
- 数值插入该列,优先转换为 TEXT 文本存储。
- NUMERIC
- 文本数据尽可能无损可逆转换 INTEGER/REAL;转换失败则保留 TEXT。
"30000.0"可以无损转整数时,转为 INTEGER 存储。
- INTEGER
- 转换规则同 NUMERIC;仅在 CAST 类型转换表达式行为和 NUMERIC 存在区别。
- REAL
- 规则同 NUMERIC;不会把
"30000.0"这类浮点文本自动转为 INTEGER。
- 规则同 NUMERIC;不会把
- NONE
- 不做任何转换,直接使用输入值原生存储类保存。
4.3 建表数据类型名称与亲和类型映射
建表语句书写的字段类型名称,SQLite 内部映射为对应亲和类型。用户只需要写业务语义类型,不需要手动指定存储类。
| 建表声明类型 | 映射亲和类型 |
|---|---|
| INT、INTEGER、TINYINT、SMALLINT、MEDIUMINT、BIGINT、UNSIGNED BIG INT、INT2、INT8 | INTEGER |
| CHARACTER(n)、VARCHAR(n)、VARYING CHARACTER(n)、NCHAR(n)、NATIVE CHARACTER(n)、NVARCHAR(n)、TEXT、CLOB | TEXT |
| BLOB | NONE |
| REAL、DOUBLE、DOUBLE PRECISION、FLOAT | REAL |
| NUMERIC、DECIMAL、BOOLEAN、DATE | NUMERIC |
4.4 类型转换实例
CREATE TABLE test(
a INT, -- 亲和类型:INTEGER
b TEXT -- 亲和类型:TEXT
);
-- a列定义INT(INTEGER亲和),插入字符串'123'
-- SQLite按照INTEGER亲和规则,无损转换存储类INTEGER,存储值123
-- b列定义TEXT亲和,插入数字456,自动转为TEXT存储'456'
INSERT INTO test(a,b) VALUES ('123', 456);
开发实践:业务建表按照业务语义写字段类型即可,不需要关心底层存储类、亲和类型细节。
5 ~> 建表语法易错点修正
5.1 主键自增关键字错误
- ❌错误写法:
PRIMARY KEY AUTOCREMENT(拼写错误) - ✅正确写法:
PRIMARY KEY AUTOINCREMENT
CREATE TABLE student(
stuid INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
score REAL
);
AUTOINCREMENT仅对 INTEGER 主键生效,实现自增 ID。
5.2 字段约束说明
PRIMARY KEY:主键约束,唯一非空。AUTOINCREMENT:主键自增,插入记录不指定主键时自动分配递增整数。NOT NULL:该字段禁止存入 NULL 空值。
6 ~> SQLite 核心 SQL 基础 CRUD
6.1 CREATE TABLE 创建表
CREATE TABLE IF NOT EXISTS 表名(
列名 类型 [约束],
列名 类型 [约束],
...
);
6.2 INSERT 插入数据
-- 指定字段插入单行
INSERT INTO student(name, age, score) VALUES ('张三', 18, 92.0);
-- 批量多行插入
INSERT INTO student(name,age,score)
VALUES
('李四',19,93.5),
('王五',18,76.5);
6.3 SELECT 查询
-- 查询全部列全部行
SELECT * FROM student;
-- 带WHERE条件过滤
SELECT * FROM student WHERE score > 80;
6.4 DELETE 删除
-- 删除满足where条件记录;where不可省略,省略会清空整张表
DELETE FROM student WHERE score < 80;
6.5 UPDATE 更新
UPDATE student SET score=95 WHERE stuid=1;
6.6 DROP TABLE 删除表
DROP TABLE IF EXISTS student;
7 ~> SQLite 重要面试补充知识点
7.1 内存数据库
sqlite3 :memory:打开纯内存数据库,全部数据存在内存,程序退出数据全部销毁。.open打开普通 db 文件才会持久化磁盘。
7.2 AUTOINCREMENT 特性
- INTEGER PRIMARY KEY 本身就具备自增能力;
AUTOINCREMENT关键字会强制 ID 单调递增,删除最大 ID 后,新插入 ID 不会复用旧删除 ID,会继续往后增长,带来轻微性能开销。
7.3 SQLite 并发限制
- 读可以并发,写操作串行;同一时刻只能有一个写事务。高并发写业务场景不适合使用 SQLite。
7.4 SQLite 事务
- 默认每条 DML 语句(INSERT/UPDATE/DELETE)默认是隐式事务,执行完成自动提交。
- 显式事务语法:
BEGIN;
INSERT INTO student(name,age,score) VALUES ('小明', 20, 88);
INSERT INTO student(name,age,score) VALUES ('小红', 21, 90);
COMMIT; --提交
-- ROLLBACK; --回滚,放弃全部修改
7.5 SQLite 文件锁
SQLite 依靠操作系统文件锁实现并发控制,不同平台文件锁行为存在差异。
7.6 NULL 处理
SQLite 三值逻辑,NULL = NULL结果不为真;判断空值必须使用IS NULL / IS NOT NULL,禁止使用=比较 NULL。
-- ✅正确
SELECT * FROM student WHERE name IS NULL;
-- ❌错误,不能使用=匹配NULL
SELECT * FROM student WHERE name = NULL;
8 ~> 开发资源参考
- SQLite 官网:https://sqlite.org
- SQLite 菜鸟教程:https://www.runoob.com/sqlite/sqlite-tutorial.html
- C/C++ 开发:包含头文件
#include <sqlite3.h>,编译链接-lsqlite3库。
9 ~> 面试高频简答整理
- SQLite 特点:轻量无服务、单 db 文件、零配置、ACID 事务、跨平台、动态类型;适合嵌入式 / 桌面本地持久化,不适合高并发写。
- SQLite 动态类型:数据类型绑定值本身,不是绑定列;通过亲和类型做插入转换,一列允许存多种类型。
- 存储类 vs 亲和类型:存储类是磁盘真实存储格式;亲和类型是列的转换偏好建议,不是强制约束。
- AUTOINCREMENT:INTEGER 主键自增关键字,拼写易错;会禁止复用已删除主键 ID,带来微小性能损耗。
- SQLite 与 MySQL 选型:本地桌面 / SDK 交付选 SQLite;服务端高并发业务选择 MySQL。
- 编译链接:C++ 开发 Ubuntu 安装
libsqlite3-dev,编译加-lsqlite3链接参数。 - 点命令:
.open.tables.schema等以.开头,不属于 SQL 语句,不要加分号。 - 内存数据库:直接运行
sqlite3不加文件名,操作内存数据库,退出数据丢失,必须.open xxx.db才能持久化磁盘。
结尾
uu们,本文的内容到这里就全部结束了,艾莉丝在这里再次感谢您的阅读!
|
结语:希望对学习Linux相关内容的uu有所帮助,不要忘记给博主“一键四连”哦!
往期回顾:
【AI大模型接入SDK】C++会话管理模块(SessionManager)设计与实现
🗡博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!🗡 ૮₍ ˶ ˊ ᴥ ˋ˶₎ა
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)