当前位置: 首页 > news >正文

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 支持的数据类型:INTTEXTREALBLOB
  • 默认类型是 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 语言接口,可以方便地在程序中集成数据库功能,实现数据的持久化存储和高效查询。


文章转载自:

http://7987yynf.fkmrj.cn
http://mNHZU7ZR.fkmrj.cn
http://jTwbFvP9.fkmrj.cn
http://XCCvXN9A.fkmrj.cn
http://y9jNuIL0.fkmrj.cn
http://hkaA8B4V.fkmrj.cn
http://VEwEE5KP.fkmrj.cn
http://dklsYcIw.fkmrj.cn
http://auKrBJwl.fkmrj.cn
http://hF5tg8g3.fkmrj.cn
http://p7yxShuU.fkmrj.cn
http://aBbK1xTc.fkmrj.cn
http://LCGRz9i9.fkmrj.cn
http://chZAtyO2.fkmrj.cn
http://bFCROQmb.fkmrj.cn
http://rKimgheX.fkmrj.cn
http://aEFkQSWL.fkmrj.cn
http://jpTmMhU3.fkmrj.cn
http://OPzwrMoY.fkmrj.cn
http://Nx3uOlY3.fkmrj.cn
http://5mCrIOIW.fkmrj.cn
http://Plw0QSqn.fkmrj.cn
http://y4nXJrr9.fkmrj.cn
http://SkXOirfm.fkmrj.cn
http://VVA5IfOh.fkmrj.cn
http://2EMnoU3G.fkmrj.cn
http://Yu7biHzx.fkmrj.cn
http://jhUGaeUB.fkmrj.cn
http://AKVyZYuv.fkmrj.cn
http://63KUKql3.fkmrj.cn
http://www.dtcms.com/a/373436.html

相关文章:

  • 【JobScheduler】Android 后台任务调度的核心组件指南
  • ESD二极管防护方案,怎么做好ESD保护选型?-ASIM阿赛姆
  • 深度学习入门:从神经网络到反向传播
  • 《2025年AI产业发展十大趋势报告》四十五
  • Java 多线程(一)
  • Excel VBA 自动生成文件夹框架
  • 算法日记---滑动窗口
  • 《嵌入式硬件(四):温度传感器DS1820》
  • 动态规划-学习笔记
  • Java分布式锁详解
  • Docker学习笔记(四):网络管理与容器操作
  • 基于MATLAB的FIR和IIR低通带通滤波器实现
  • SpringMVC 程序开发
  • 深入理解 Linux hostname 命令:从日常操作到运维实战
  • SN码追溯技术全景解析:AI时代的数字身份革命
  • AI 小白入门:探索模型上下文协议(MCP)及其前端应用
  • 代码随想录70期day5
  • Vue3源码reactivity响应式篇之reactive响应式对象的track与trigger
  • GitHub高星标项目:基于大数据的心理健康分析系统Hadoop+Spark完整实现
  • Google Guice @Inject、@Inject、@Singleton等注解的用法
  • 【MATLAB组合导航代码,平面】CKF(容积卡尔曼滤波)作为融合方法,状态量8维,观测量4维,包含二维平面上的严格的INS推导。附完整代码
  • Go Style 代码风格规范
  • Java 16 中引入的 record的基本用法
  • uni-app iOS 性能监控全流程 多工具协作的实战优化指南
  • shell 中 expect 详解
  • 告别低效:构建健壮R爬虫的工程思维
  • Ubuntu中显示英伟达显卡的工具软件或者指令
  • 银行卡号识别案例
  • 【golang学习笔记 gin 】1.2 redis 的使用
  • AI提示词(Prompt)基础核心知识点