Day38 SQLite数据库 C 语言接口
day38 SQLite数据库 C 语言接口
1. 数据库基础概念
1.1 数据库分类
- 大型数据库:Oracle
- 中型数据库:MySQL、MSSQL
- 小型数据库:SQLite、DBII、powdb
1.2 常用名词
- DB:数据库(Database),用于数据的存储、查询和更新
- DBMS:数据库管理系统
- MIS:管理信息系统
- OA:办公自动化
1.3 关系型数据库
- SQL:Structured Query Language(结构化查询语言)
- 分类:
- DDL:Data Definition Language(数据定义语言),用于建表等
- DML:Data Manipulation Language(数据操作语言),用于新增、修改、删除数据
- DQL:Data Query Language(数据查询语言),用于查询数据
2. SQLite 特点
SQLite 是一种嵌入式数据库系统,具有以下特点:
- 开源:使用 C 语言开发
- 轻量级:代码量约 1 万行,总大小在 10M 以内
- 无需安装:绿色软件,无需复杂安装过程
- 文件型数据库:数据存储在单一文件中,便于移动
- 容量限制:最大支持 2TB 的数据容量
- 平台兼容:可在多种操作系统上运行
3. SQLite 安装与基本使用
3.1 安装方法
在线安装(Ubuntu/Debian 系统)
sudo apt-get install sqlite3 # 安装 SQLite 命令行工具
sudo apt-get install libsqlite3-dev # 安装开发库(包含头文件和静态库)
验证安装
sqlite3 --version # 查看版本信息
sqlite3 --help # 查看帮助信息
编译 C 程序
gcc test.c -lsqlite3 -lpthread # 链接 SQLite 库和线程库
3.2 基本使用
启动 SQLite
sqlite3 xxx.db # 用 SQLite 打开或创建名为 xxx.db 的数据库文件
- 成功启动后会显示
sqlite>
提示符 - 退出命令:
.q
或.exit
- 如果出现
...>
提示符,表示命令未结束,需要输入;
结束命令
创建数据库
touch test.db # 创建空数据库文件
sqlite3 test.db # 用 SQLite 打开该文件
3.3 系统维护命令(以 . 开头)
命令 | 功能 |
---|---|
.database | 列出当前数据库及其关联的文件路径 |
.tables | 列出当前数据库中的所有表 |
.schema [表名] | 显示指定表的结构(CREATE 语句) |
.dump [表名] | 导出数据库或指定表的 SQL 语句 |
.databases | 列出已附加的数据库名称及其文件路径 |
.headers on/off | 开启/关闭查询结果的列标题显示 |
.exit | 退出 SQLite 程序 |
数据库导入导出
# 导出数据库
sqlite3 test.db .dump > backup.sql# 导入数据库
sqlite3 new.db < backup.sql
4. SQL 基本语法
4.1 DDL(数据定义语言)
创建表
-- 创建表(默认字段类型为 TEXT)
CREATE TABLE user(id, name, age);-- 创建指定字段类型的表
CREATE TABLE user(id INT, name CHAR, age INT);
- SQLite 支持的数据类型:
INT
、TEXT
、REAL
、BLOB
- 默认类型是
TEXT
删除表
DROP TABLE user; -- 删除 user 表
4.2 DML(数据操作语言)
插入数据
-- 插入指定字段的数据
INSERT INTO user(id, age) VALUES(1, 10);-- 插入完整记录
INSERT INTO user VALUES(3, "wang", 11);-- 只插入部分字段
INSERT INTO user(age) VALUES(12);
更新数据
-- 修改指定条件的数据
UPDATE user SET id = 1 WHERE name = 'li';
UPDATE user SET id = 1 WHERE name = "li" AND passwd = "123";
UPDATE user SET id = 2 WHERE name = "li" OR name = "zhao";
删除数据
-- 删除表中所有数据
DELETE FROM user;-- 删除满足条件的数据
DELETE FROM user WHERE id = 1;
DELETE FROM user WHERE id = 1 AND name = "zhang";
DELETE FROM user WHERE id = 1 OR id = 2;
4.3 DQL(数据查询语言)
基本查询
-- 查询所有数据
SELECT * FROM user;-- 查询指定字段
SELECT id FROM user;
SELECT id, name FROM user;
条件查询
-- 带 WHERE 条件的查询
SELECT * FROM user WHERE NOT age < 30;
SELECT * FROM user WHERE name LIKE '三一'; -- 使用通配符 % 和 _-- 排序查询
SELECT * FROM user ORDER BY id; -- 升序排序
SELECT * FROM user ORDER BY id DESC; -- 降序排序-- 限制结果数量
SELECT * FROM user LIMIT 2; -- 只返回前 2 条记录
SELECT * FROM user WHERE age > 20 OR age < 50 ORDER BY age DESC LIMIT 2;
5. SQLite C 语言接口
5.1 开发环境准备
- 头文件:
#include <sqlite3.h>
- 编译链接:
gcc test.c -lsqlite3 -lpthread
5.2 核心 API 函数
5.2.1 打开数据库
int sqlite3_open(char *path, sqlite3 **db);
- 功能:打开指定路径的数据库文件,如果不存在则创建
- 参数:
path
:数据库文件路径db
:数据库连接句柄的指针
- 返回值:成功返回
SQLITE_OK
(0),失败返回错误码
5.2.2 关闭数据库
int sqlite3_close(sqlite3 *db);
- 功能:关闭指定的数据库连接
- 参数:
db
- 要关闭的数据库连接 - 返回值:成功返回
SQLITE_OK
(0),失败返回错误码
5.2.3 执行 SQL 语句
int sqlite3_exec(sqlite3 *db, char *sql, callback fun, void *arg, char **errmsg);
- 功能:执行 SQL 语句(INSERT、UPDATE、DELETE 等非查询语句)
- 参数:
db
:数据库连接sql
:要执行的 SQL 语句fun
:回调函数(用于处理查询结果)arg
:传递给回调函数的参数errmsg
:错误信息指针
- 返回值:成功返回
SQLITE_OK
(0),失败返回错误码
5.3 回调函数
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {int i;for(i=0; i<argc; i++) {printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}
- 功能:处理查询结果
- 参数:
NotUsed
:用户自定义参数argc
:结果列数argv
:结果数据数组azColName
:列名数组
- 返回值:0 表示正常处理
5.4 完整示例代码
// 01 引入标准输入输出库,用于printf、fprintf等输入输出函数
#include <stdio.h>
// 02 引入SQLite3库,包含SQLite数据库操作的相关函数和定义
#include <sqlite3.h>// 04 定义回调函数,用于处理sqlite3_exec执行SQL查询后的结果
// 参数说明:
// - NotUsed:用户传递的参数(此处未使用)
// - argc:查询结果的列数
// - argv:存储查询结果的数据数组,每个元素对应一列的值
// - azColName:存储查询结果的列名数组
static int callback(void *NotUsed, int argc, char **argv, char **azColName){int i;// 06 循环遍历每一列数据for(i=0; i<argc; i++){// 07 打印列名和对应的值,若值为NULL则显示"NULL"printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}// 09 每一行数据打印完后换行分隔printf("\n");// 10 回调函数返回0,表示正常处理return 0;
}// 13 主函数,程序入口
int main(int argc, char **argv){sqlite3 *db; // 14 SQLite数据库连接句柄char *zErrMsg = 0; // 15 用于存储错误信息的指针int rc; // 16 用于存储函数执行结果的返回码// 18 检查命令行参数数量是否正确(需要传入数据库文件名和SQL语句)if( argc!=3 ){// 19 若参数不正确,打印用法提示fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);return(1);}// 22 打开指定的SQLite数据库文件,若文件不存在则创建rc = sqlite3_open(argv[1], &db);// 23 检查数据库是否成功打开if( rc ){// 24 打印打开数据库失败的错误信息fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db); // 25 关闭数据库连接return(1); // 26 返回错误码}// 28 执行指定的SQL语句,查询结果由callback函数处理// 参数依次为:数据库连接、SQL语句、回调函数、传递给回调的参数、错误信息指针rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);// 29 检查SQL语句是否执行成功if( rc!=SQLITE_OK ){// 30 打印SQL执行错误信息fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg); // 31 释放错误信息占用的内存}sqlite3_close(db); // 33 关闭数据库连接return 0; // 34 程序正常结束
}
运行示例
# 创建数据库并插入数据
./a.out test.db "CREATE TABLE user(id INT, name TEXT, age INT);"
./a.out test.db "INSERT INTO user VALUES(1, '张三', 15);"# 查询数据
./a.out test.db "SELECT * FROM user;"
理想输出结果:
id = 1
name = 张三
age = 15
5.5 简单数据库操作示例
#include <stdio.h>
#include <sqlite3.h>// 主函数,程序入口点
int main(int argc, char **argv)
{// 声明SQLite数据库连接指针,初始化为NULLsqlite3* db = NULL;// 声明错误信息字符串指针,用于存储SQL操作的错误信息char *errmsg = NULL;// 声明返回值变量,用于接收SQLite函数的执行结果int ret;// 打开指定的SQLite数据库文件(./aaa.db)// 如果文件不存在,SQLite会自动创建该数据库文件ret = sqlite3_open("./aaa.db", &db);// 检查数据库是否成功打开if(SQLITE_OK != ret){// 输出打开数据库失败的错误信息fprintf(stderr, "sqlite3_open %s\n", sqlite3_errstr(ret));// 关闭数据库连接sqlite3_close(db);// 程序异常退出,返回1return 1;}// 定义要执行的SQL插入语句:向user表中插入一条记录char sql_cmd[] = "INSERT INTO user VALUES(11, 'li1si', 20);";// 执行SQL语句// 参数说明:数据库连接、SQL命令、回调函数(NULL表示不需要)、// 回调函数参数(NULL)、错误信息指针ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);// 检查SQL语句是否执行成功if(SQLITE_OK != ret){// 输出执行SQL失败的错误信息,包括具体的SQL命令和错误描述fprintf(stderr, "sqlite3_exec sql_cmd:[%s] %s\n", sql_cmd, errmsg);// 释放错误信息所占用的内存sqlite3_free(errmsg);// 关闭数据库连接sqlite3_close(db);// 程序异常退出,返回1return 1;}// 关闭数据库连接sqlite3_close(db);// 程序正常退出,返回0return 0;
}
6. 总结回顾
6.1 数据库基本操作
- .help:显示帮助信息
- .database:显示数据库文件名
- .tables:查看数据库中的表
- .header on:打开表头显示
- .schema:显示表结构
- .q:退出数据库
6.2 SQL 语句
-
INSERT:插入数据
INSERT INTO 表名 VALUES('值1', '值2', '值3', ...);
-
SELECT:查询数据
SELECT 列名 FROM 表名; SELECT 列名 FROM 表名 WHERE 条件; -- 条件示例:id > 10, name LIKE '三_', '%' 匹配0到任意多个字符,'_' 匹配一个字符
-
UPDATE:更新数据
UPDATE 表名 SET 字段 = 值 WHERE 条件;
-
DELETE:删除数据
DELETE FROM 表名 WHERE 条件;
6.3 C 语言编程接口
- sqlite3_open():打开数据库
- sqlite3_exec():执行 SQL 语句
- sqlite3_close():关闭数据库
SQLite 提供了简单而强大的数据库功能,特别适合嵌入式系统和小型应用程序。通过 C 语言接口,可以方便地在程序中集成数据库功能,实现数据的持久化存储和高效查询。