SQLite

SQLite

  • 是一个开源、轻量级、零配置、无服务器、自包含、事务性、支持标准SQL、跨平台的数据库管理系统
  • 事务性,支持ACID(来自维基百科)
    • 原子性(Atomicity):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
    • 一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
    • 事务隔离(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同等级,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
    • 持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会遗失。

操作命令

命令 说明 示例
<font style="color:rgb(32, 33, 34);">.open 文件名</font> 打开或创建数据库文件 <font style="color:rgb(32, 33, 34);">.open student.db</font>
<font style="color:rgb(32, 33, 34);">.databases</font> 显示所有连接的数据库 <font style="color:rgb(32, 33, 34);">.databases</font>
<font style="color:rgb(32, 33, 34);">.attach 文件 as 别名</font> 附加另一个数据库 <font style="color:rgb(32, 33, 34);">.attach archive.db as archive</font>
<font style="color:rgb(32, 33, 34);">.backup 文件名</font> 备份当前数据库 <font style="color:rgb(32, 33, 34);">.backup backup.db</font>
<font style="color:rgb(32, 33, 34);">.restore 文件名</font> 从备份恢复数据库 <font style="color:rgb(32, 33, 34);">.restore recovery.db</font>
<font style="color:rgb(32, 33, 34);">.quit</font> 退出 SQLite <font style="color:rgb(32, 33, 34);">.quit</font>
<font style="color:rgb(32, 33, 34);">.exit</font> 退出 SQLite <font style="color:rgb(32, 33, 34);">.exit</font>
<font style="color:rgb(32, 33, 34);">.help</font> 显示帮助信息 <font style="color:rgb(32, 33, 34);">.help</font>

表和结构命令

命令 说明 示例
<font style="color:rgb(32, 33, 34);">.tables</font> 显示所有表 <font style="color:rgb(32, 33, 34);">.tables</font>
<font style="color:rgb(32, 33, 34);">.schema [表名]</font> 显示表结构 <font style="color:rgb(32, 33, 34);">.schema students</font>
<font style="color:rgb(32, 33, 34);">.indexes [表名]</font> 显示索引 <font style="color:rgb(32, 33, 34);">.indexes students</font>

常见操作API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*************************************************
* 4. 常用 API 介绍(SQLite3 C 接口)
*************************************************/

#include <sqlite3.h>

/*************************************************
* 一、数据库连接管理
*************************************************/

/**
* 打开一个数据库连接。如果数据库文件不存在,则创建它
*
* @param filename 数据库文件路径
* @param ppDb 一个指向 sqlite3* 的指针。成功后写入数据库连接句柄
*
* @return SQLITE_OK 表示成功,否则返回错误码
*/
int sqlite3_open(const char *filename, sqlite3 **ppDb);


/**
* 关闭数据库连接,并释放所有资源
*
* @param db 数据库连接句柄
*
* @return SQLITE_OK 表示成功
* 如果还有未完成的预处理语句,可能返回错误码
*/
int sqlite3_close(sqlite3 *db);


/**
* 获取最近一次错误的英文描述字符串
*
* @param db 数据库连接句柄
*
* @return 指向错误信息字符串的指针
*/
const char *sqlite3_errmsg(sqlite3 *db);


/*************************************************
* 二、执行 SQL 语句(预处理方式)
*************************************************/

/**
* 将一条 SQL 语句编译成预处理语句对象
*
* @param db 数据库连接句柄
* @param zSql SQL 语句文本
* @param nByte SQL 文本长度(字节),-1 表示自动计算到 '\0'
* @param ppStmt 输出预处理语句句柄
* @param pzTail 指向未使用 SQL 部分的指针(通常为 NULL)
*
* @return SQLITE_OK 表示成功,否则返回错误码
*/
int sqlite3_prepare_v2(
sqlite3 *db,
const char *zSql,
int nByte,
sqlite3_stmt **ppStmt,
const char **pzTail
);


/**
* 绑定 64 位整数参数
*
* @param stmt 预处理语句句柄
* @param index 参数序号(从 1 开始)
* @param value 要绑定的整数值
*
* @return SQLITE_OK 表示成功
*/
int sqlite3_bind_int64(
sqlite3_stmt *stmt,
int index,
sqlite3_int64 value
);


/**
* 绑定文本字符串参数
*
* @param stmt 预处理语句句柄
* @param index 参数序号(从 1 开始)
* @param value 要绑定的字符串
* @param len 字符串长度(字节),-1 表示自动计算
* @param destructor 内存管理方式:
* SQLITE_STATIC -> SQLite 不会释放字符串
* SQLITE_TRANSIENT-> SQLite 会复制字符串
*
* @return SQLITE_OK 表示成功
*/
int sqlite3_bind_text(
sqlite3_stmt *stmt,
int index,
const char *value,
int len,
void (*destructor)(void *)
);


/*************************************************
* 三、直接执行 SQL(非预处理方式)
*************************************************/

/**
* 执行一条或多条 SQL 语句
* 适用于 CREATE、INSERT 等无需返回结果集的语句
*
* @param db 数据库连接句柄
* @param sql SQL 语句字符串
* @param callback 回调函数(每条结果记录调用一次,可为 NULL)
* @param arg 传递给回调函数的第一个参数
* @param errmsg 错误信息指针(需要 sqlite3_free 释放)
*
* @return SQLITE_OK 表示成功,否则返回错误码
*/
int sqlite3_exec(
sqlite3 *db,
const char *sql,
int (*callback)(void *, int, char **, char **),
void *arg,
char **errmsg
);


/*************************************************
* 四、执行预处理语句
*************************************************/

/**
* 逐步执行预处理语句
*
* @param pStmt 预处理语句句柄
*
* @return SQLITE_ROW 表示有一行结果
* SQLITE_DONE 表示执行完成
* 其他值 表示错误
*/
int sqlite3_step(sqlite3_stmt *pStmt);


/**
* 获取当前行指定列的文本值
*
* @param stmt 预处理语句句柄
* @param iCol 列索引(从 0 开始)
*
* @return 指向文本数据的指针
*/
const unsigned char *sqlite3_column_text(
sqlite3_stmt *stmt,
int iCol
);


/**
* 销毁预处理语句对象,释放所有资源
*
* @param pStmt 预处理语句句柄
*
* @return SQLITE_OK 表示成功
*/
int sqlite3_finalize(sqlite3_stmt *pStmt);

实操代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
#include <iostream>
using namespace std;
#include <sqlite3.h>

struct StudentInfo{
StudentInfo(const std::string& name, const std::string& gender, int age, double gap)
:name(name), gender(gender), age(age), gap(gap)
{}
std::string name;
std::string gender;
int age;
double gap;
};

class StudentDB{
public:
StudentDB(const std::string& dbName){
// 创建数据库
if(SQLITE_OK != sqlite3_open("student.db", &_db)){
std::cout << "open student.db failed" <<std::endl;
exit(-1);
}
// 对数据库初始化 - 创建学生表
if(!initDataBase()){
std::cout << "init database failed" << std::endl;
exit(-1);
}
}

~StudentDB(){
if(_db){
sqlite3_close(_db);
_db = nullptr;
}
}

bool insertStudentInfo(const StudentInfo& info){
// 构建sql语句
std::string sql = "INSERT INTO student(name, gender, age, gap)"
"VALUES(?, ?, ?, ?);";
// 准备SQL语句
sqlite3_stmt* stmt = nullptr;
if(SQLITE_OK != sqlite3_prepare_v2(_db, sql.c_str(), -1, &stmt, nullptr)){
std::cout << "prepare sql failed: " << sqlite3_errmsg(_db) << std::endl;
return false;
}
// 绑定参数
sqlite3_bind_text(stmt, 1, info.name.c_str(), -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, info.gender.c_str(), -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 3, info.age);
sqlite3_bind_double(stmt, 4, info.gap);

// 执行SQL语句,检查是否执行成功
if(SQLITE_DONE != sqlite3_step(stmt)){
std::cout << "execute sql failed: " << sqlite3_errmsg(_db) << std::endl;
sqlite3_finalize(stmt);
return false;
}
// 执行完sql,释放stmt
sqlite3_finalize(stmt);
std::cout<<"insert student info success"<<std::endl;
return true;
}

bool queryStudentInfo(const std::string& name){
// 构建sql语句
std::string sql = "SELECT * FROM student WHERE name = ?";
// 准备SQL语句
sqlite3_stmt* stmt = nullptr;
if(SQLITE_OK != sqlite3_prepare_v2(_db, sql.c_str(), -1, &stmt, nullptr)){
std::cout << "prepare sql failed: " << sqlite3_errmsg(_db) << std::endl;
return false;
}
// 绑定参数
sqlite3_bind_text(stmt, 1, name.c_str(), -1, SQLITE_TRANSIENT);
// 执行SQL语句,检查是否执行成功
int result = sqlite3_step(stmt);
if(SQLITE_ROW != result && SQLITE_DONE != result){
std::cout << "execute sql failed: " << sqlite3_errmsg(_db) << std::endl;
sqlite3_finalize(stmt);
return false;
}
// 执行完sql,释放stmt
sqlite3_finalize(stmt);
std::cout<<"query student info success"<<std::endl;
return true;
}

bool queryAllStudentInfo(){
// 构建sql语句
std::string sql = "SELECT * FROM student";
// 准备SQL语句
sqlite3_stmt* stmt = nullptr;
if(SQLITE_OK != sqlite3_prepare_v2(_db, sql.c_str(), -1, &stmt, nullptr)){
std::cout << "prepare sql failed: " << sqlite3_errmsg(_db) << std::endl;
return false;
}

// 执行SQL语句,检查是否执行成功
int result = sqlite3_step(stmt);
if(SQLITE_ROW != result && SQLITE_DONE != result){
std::cout << "execute sql failed: " << sqlite3_errmsg(_db) << std::endl;
sqlite3_finalize(stmt);
return false;
}

std::cout<< "-------------------student table info:-----------------" <<std::endl;
// 遍历结果集
while(SQLITE_ROW == result){
// 表结构是 id, name, gender, age, gap,所以列索引从1开始获取我们需要的值
std::string name(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 1)));
std::string gender(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 2)));
int age = sqlite3_column_int(stmt, 3);
double gap = sqlite3_column_double(stmt, 4);
std::cout << "name: " << name << ", gender: " << gender << ", age: " << age << ", gap: " << gap << std::endl;
result = sqlite3_step(stmt);
}
// 检查是否还有更多的行
if(SQLITE_DONE != result){
std::cout << "execute sql failed: " << sqlite3_errmsg(_db) << std::endl;
return false;
}

std::cout<< "-------------------student table info end-----------------" <<std::endl;
// 执行完sql,释放stmt
sqlite3_finalize(stmt);
std::cout<<"query all student info success"<<std::endl;
return true;
}

// 修改学生信息
bool updateStudentInfo(const std::string& name, const StudentInfo& info){
// 构建sql语句
std::string sql = "UPDATE student SET name = ?, gender = ?, age = ?, gap = ? WHERE name = ?";
// 准备SQL语句
sqlite3_stmt* stmt = nullptr;
if(SQLITE_OK != sqlite3_prepare_v2(_db, sql.c_str(), -1, &stmt, nullptr)){
std::cout << "prepare sql failed: " << sqlite3_errmsg(_db) << std::endl;
return false;
}
// 绑定参数
sqlite3_bind_text(stmt, 1, info.name.c_str(), -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, info.gender.c_str(), -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 3, info.age);
sqlite3_bind_double(stmt, 4, info.gap);
sqlite3_bind_text(stmt, 5, name.c_str(), -1, SQLITE_TRANSIENT);

// 执行SQL语句,检查是否执行成功
if(SQLITE_DONE != sqlite3_step(stmt)){
std::cout << "execute sql failed: " << sqlite3_errmsg(_db) << std::endl;
sqlite3_finalize(stmt);
return false;
}
// 执行完sql,释放stmt
sqlite3_finalize(stmt);
std::cout<<"update student info success"<<std::endl;
return true;
}

// 删除学生信息
bool deleteStudentInfo(const std::string& name){
// 构建sql语句
std::string sql = "DELETE FROM student WHERE name = ?";
// 准备SQL语句
sqlite3_stmt* stmt = nullptr;
if(SQLITE_OK != sqlite3_prepare_v2(_db, sql.c_str(), -1, &stmt, nullptr)){
std::cout << "prepare sql failed: " << sqlite3_errmsg(_db) << std::endl;
return false;
}
// 绑定参数
sqlite3_bind_text(stmt, 1, name.c_str(), -1, SQLITE_TRANSIENT);
// 执行SQL语句,检查是否执行成功
if(SQLITE_DONE != sqlite3_step(stmt)){
std::cout << "execute sql failed: " << sqlite3_errmsg(_db) << std::endl;
sqlite3_finalize(stmt);
return false;
}
// 执行完sql,释放stmt
sqlite3_finalize(stmt);
std::cout<<"delete student info success"<<std::endl;
return true;
}

private:
bool initDataBase(){
// 创建数据库表
const std::string studentTab = "CREATE TABLE IF NOT EXISTS student( "
"id INTEGER PRIMARY KEY, "
"name TEXT NOT NULL, "
"gender TEXT NOT NULL, "
"age INTEGER NOT NULL, "
"gap REAL NOT NULL)";
char* errMsg = nullptr;
if(SQLITE_OK != sqlite3_exec(_db, studentTab.c_str(), nullptr, nullptr, &errMsg)){
std::cout << "create table failed: " << errMsg << std::endl;
sqlite3_free(errMsg);
return false;
}
std::cout<<"create studentTab success"<<std::endl;
return true;
}

private:
sqlite3* _db;
};

int main()
{
StudentInfo info1("张三", "男", 18, 3.5);
StudentInfo info2("李四", "男", 19, 3.8);
StudentInfo info3("王五", "男", 20, 2.9);
StudentInfo info4("赵六", "女", 21, 3.0);

StudentDB db("student.db");
db.insertStudentInfo(info1);
db.insertStudentInfo(info2);
db.insertStudentInfo(info3);
db.insertStudentInfo(info4);

db.queryAllStudentInfo();

info1.age = 20;
db.updateStudentInfo("张三", info1);

db.queryAllStudentInfo();

db.deleteStudentInfo("张三");

db.queryAllStudentInfo();

return 0;
}

SQLite
https://weihehe.top/2026/03/03/Cline部署模型上下文协议/
作者
weihehe
发布于
2026年3月3日
许可协议