SQLite数据库使用指南以及相关API编程

SQLite介绍

  • SQLite是一种基于C语言开发的轻量级、快速、自包含、高可靠性和全功能的SQL数据库引擎。它是全球范围内使用最为广泛的数据库引擎,被嵌入到所有移动设备和大部分计算机中,并且伴随着无数日常使用的应用程序一起提供。
  • SQLite的文件格式具有稳定性、跨平台性以及向后兼容性,开发者承诺将持续保持这种特性至少到2050年。因其特点,SQLite数据库文件常被用作不同系统间交换丰富内容的容器,并作为一种长期数据归档格式。目前,全球有超过1万亿(1e12)个SQLite数据库处于活跃使用状态。

SQLite相关链接

SQLite压缩包介绍及使用

  • 进入到SQLite下载页后,可以看到有很多压缩包。下面简单介绍下这些不同压缩包有什么区别。

  • Source Code -> sqlite-amalgamation-3450200.zip

    • 是 SQLite 数据库引擎提供的一个打包形式,它包含了编译 SQLite 库所需的所有 C 源代码文件的合并版本。这个包是为了简化 SQLite 的分发和集成到其他项目中而设计的。
    • 如果想在自己代码中集成SQLite数据库,下载这个包并包含其头文件和源文件即可。
  • Source Code -> sqlite-autoconf-3450200.tar.gz

    • SQLite 的另一种打包形式,它是为方便在类 Unix 系统(如 Linux、BSD、Mac OS X 等)上通过自动配置工具 autoconf 和 make 进行编译和安装而准备的。这个包通常包含了 SQLite 源代码以及用于生成可移植配置脚本(configure)的一系列辅助文件。
    • 这个包主要在Linux系统使用,如果不想集成SQLite源代码,而是集成SQLite的动态库,可以下载这个包在Linux系统上编译。
    • 这个包下载解压后,分别执行以下命令编译安装
    sh 复制代码
      ./configure --prefix=${pwd}/_install
      make
      make install
    • 执行完成后,在当前目录的_install目录下就会生成对应的头文件,库文件和可执行程序。
  • Documentation -> sqlite-doc-3450200.zip

    • SQLite的一些说明文档
  • Precompiled Binaries for Linux -> sqlite-tools-linux-x64-3450200.zip

    • 这个包是Linux平台X86架构的可执行程序,如果不需要将SQLite集成到代码中,可以直接下载这个包,在命令行执行SQL命令去操作数据库。
  • Precompiled Binaries for Windows -> sqlite-dll-win-x86-3450200.zip

    • 提供的Windows平台32位动态库
    • 这个包里只有动态库,我们需要借助Visual Studio生成一下静态库,如果安装的是Visual Studio 2015,找到 Microsoft Visual Studio 14.0\VC\bin\lib.exe这个程序,在cmd命令行执行以下命令
    sh 复制代码
      "D:\Microsoft Visual Studio 14.0\VC\bin\lib.exe" /def:sqlite3.def /machine:ix86
    • 执行成功后,就会生成静态库文件。
  • Precompiled Binaries for Windows -> sqlite-dll-win-x64-3450200.zip

    • 提供的Windows平台64位动态库,如何生成静态库参考上面。
  • Precompiled Binaries for Windows -> sqlite-tools-win-x64-3450200.zip

    • Windows平台可执行程序
    • 如果不想集成SQLite,可以直接下载这个包,在命令行运行程序执行SQL语句操作数据库。
  • Alternative Source Code Formats -> sqlite-src-3450200.zip

    • 这个包未经过预处理的SQLite源代码,它包含完整的源文件树结构,包括所有的C语言源码文件、头文件、Makefile以及其他支持文件。
  • 总结

    • 如果只需要通过命令行,执行SQL语句操作数据库,Linux平台下载这个包 sqlite-tools-linux-x64-3450200.zip,Windows平台下载 sqlite-tools-win-x64-3450200.zip。
    • 如果需要把SQLite以代码形式集成到我们的代码工程中,通过SQLite提供的API操作数据库。Windows和类Unix平台都可以直接使用这个包 sqlite-amalgamation-3450200.zip
    • 如果需要把SQLite以库形式集成到我们的代码工程中,类Unix平台下载这个包sqlite-autoconf-3450200.tar.gz去编译,Windows平台下载 sqlite-dll-win-x86-3450200.zip。

命令行使用

  • 启动SQLite

    • 直接运行sqlite可执行程序,以Windows为例
    • 运行成功后,就进入了数据库,接下来可以执行SQL语句来操作
  • 创建或打开数据库

    • 执行以下命令,就会打开或者一个数据库
    sql 复制代码
      .open student.db
  • 创建表
    *

    sql 复制代码
      CREATE TABLE STUDENT(ID INT PRIMARY KEY NOT NULL, NAME CHAR(128), SCORE INT);
  • 插入数据
    *

    sql 复制代码
      INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1001, 'JACK', 98);
      INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1002, 'MARY', 96);
      INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1003, 'TOM', 96);
  • 查询数据
    *

    sql 复制代码
      SELECT * FROM STUDENT;
    • 可以看到表中就有了我们插入的数据。
  • 命令行的使用就不过多介绍,主要是SQL语句的使用。

SQLite API介绍

  • SQLite API编程常用的接口有以下几个

  • sqlite3_open
    *

    c 复制代码
      int sqlite3_open(const char *zFilename, sqlite3 **ppDb)
    • 函数功能:打开一个指向 SQLite 数据库文件的连接
    • 参数
      • zFilename:数据库名
      • ppDb : 数据库句柄
    • 返回值:成功返回 SQLITE_OK
  • sqlite3_exec
    *

    c 复制代码
      int sqlite3_exec(sqlite3 *ppDb,  const char *sql,  int (*callback)(void*, int, char**,char**),  void *data,  char **errmsg)
    • 函数功能:执行SQL语句,异步接口。
    • 参数
      • ppDb:打开的数据库句柄
      • sql:需要执行的SQL语句
      • callback:回调函数,主要用于查询数据时,在该回调函数中获取数据
        • 参数1:回调函数可通过这个参数把数据传到外部
        • 参数2:查询的数据库表数据一共有多少行
        • 参数3:数据字段名
        • 数据4:数据值
      • data: 传递给回调函数的参数
      • errmsg:执行SQL语句出错时的错误信息
    • 返回值:成功返回 SQLITE_OK
  • sqlite3_get_table
    *

    c 复制代码
      int sqlite3_get_table(sqlite3 *ppDb, const char *sql, char ***pazResult, int *pnRow, int *pnColumn, char **errmsg)
    • 函数功能:执行SQL语句,同步接口。
    • 参数
      • ppDb:数据库句柄
      • sql:需要执行的SQL语句
      • pazResult:输出参数,用于存储查询结果的二维字符数组指针
      • pnRow:输出参数,用于接收查询结果的行数
      • pnColumn:输出参数,用于接收查询结果的列数
      • errmsg:执行SQL语句出错时的错误信息
    • 返回值:成功返回 SQLITE_OK
  • sqlite3_close
    *

    c 复制代码
      int sqlite3_close(sqlite3 *db);
    • 函数功能:关闭数据库

编程示例

c 复制代码
  #include <stdio.h>
  #include "sqlite3.h"
  
  int callback(void* para, int columenCount, char** columnValue, char** columnName) {
  	char *stData = (char*)para;
  	// 获取的数据可以在这里保存和处理,也可以通过保存到 para 参数中,在外部保存处理
  	for (int i = 0; i < columenCount; i++) {
  		printf("%s\t%s\n", columnName[i], columnValue[i]);
  	}
  	strcpy(stData, "this is callback");
  	return 0;
  }
  
  int main(){
  	sqlite3 *db = NULL;
  	char *zErrMsg = NULL;
  	char sql[1024] = { 0 };
  
  	// 打开数据库
  	int rc = sqlite3_open("student.db", &db);
  	if (rc != SQLITE_OK) {
  		printf("open sqlite failed, errMsg: %s.", sqlite3_errmsg(db));
  		return -1;
  	}
  
  	// 创建表
  	strcpy(sql, "CREATE TABLE STUDENT(ID INT PRIMARY KEY NOT NULL, NAME CHAR(128), SCORE INT);");
  	rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);
  	if (rc != SQLITE_OK) {
  		printf("create table failed, errMsg: %s", zErrMsg);
  		sqlite3_free(zErrMsg);
  		sqlite3_close(db);
  		return -1;
  	}
  
  	// 插入数据
  	strcpy(sql, "INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1001, 'JACK', 98);INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1002, 'MARY', 96);INSERT INTO STUDENT(ID,NAME,SCORE) VALUES (1003, 'TOM', 96);");
  	rc = sqlite3_exec(db, sql, callback, NULL, &zErrMsg);
  	if (rc != SQLITE_OK) {
  		printf("insert data failed, errMsg: %s", zErrMsg);
  		sqlite3_free(zErrMsg);
  		sqlite3_close(db);
  		return -1;
  	}
  
  	char stData[100] = { 0 };
  	strcpy(sql, "SELECT * FROM STUDENT;");
  	rc = sqlite3_exec(db, sql, callback, stData, &zErrMsg);
  	if (rc != SQLITE_OK) {
  		printf("query data failed, errMsg: %s", zErrMsg);
  		sqlite3_free(zErrMsg);
  		sqlite3_close(db);
  		return -1;
  	}
  
  	printf("stData = %s\n", stData);
  
  	// 同步接口
  	char **dbResult;
  	int nRow = 0, nColumn = 0;
  	strcpy(sql, "SELECT * FROM STUDENT;");
  	rc = sqlite3_get_table(db, sql, &dbResult, &nRow, &nColumn, zErrMsg);
  	if (rc != SQLITE_OK) {
  		printf("query data failed, errMsg: %s", zErrMsg);
  		sqlite3_free(zErrMsg);
  		sqlite3_close(db);
  		return -1;
  	}
  
  	// 打印字段名
  	for (int i = 0; i < nColumn; i++) {
  		printf("%s\t", dbResult[i]);
  	}
  	printf("\n");
  
  	//打印数据
  	for (int i = nColumn; i <= nRow * nColumn; i += nColumn) {
  		for (int j = 0; j < nColumn; j++) {
  			printf("%s\t", dbResult[i + j]);
  		}
  		printf("\n");
  	}
  
  	// 释放dbResult
  	sqlite3_free_table(dbResult);
  
  	sqlite3_close(db);
  
  	system("pause");
  	return 0;
  }
  • 打印结果

参考

相关推荐
wolf犭良5 分钟前
27、Python 数据库操作入门(SQLite)从基础到实战精讲
数据库·python·sqlite
画扇落汗22 分钟前
Python 几种将数据插入到数据库的方法(单行插入、批量插入,SQL Server、MySQL,insert into)
数据库·python·sql·mysql
银河系的一束光24 分钟前
mysql的下载和安装2025.4.8
数据库·mysql
Full Stack Developme31 分钟前
SQL 查询中使用 IN 导致性能问题的解决方法
数据库·sql
杰杰批1 小时前
第十四届蓝桥杯大赛软件赛国赛C/C++研究生组
c语言·c++·蓝桥杯
神经星星1 小时前
【vLLM 学习】API 客户端
数据库·人工智能·机器学习
aaaweiaaaaaa2 小时前
蓝桥杯c ++笔记(含算法 贪心+动态规划+dp+进制转化+便利等)
c语言·数据结构·c++·算法·贪心算法·蓝桥杯·动态规划
小光学长2 小时前
基于flask+vue框架的助贫公益募捐管理系统1i6pi(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
XiaoLeisj2 小时前
【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈开发图书管理系统:查询图书属性接口(注解实现)、修改图书属性接口(XML 实现)
xml·java·数据库·spring boot·sql·java-ee·mybatis
FreeLikeTheWind.2 小时前
Qt 开发时可以在函数内引用的头文件
开发语言·c++·qt