SQLite3使用笔记(1)——查询

简介: SQLite3使用笔记(1)——查询

SQLite3使用笔记(1)——查询

目录

1. 概述

SQLite是一个嵌入式SQL数据库引擎。与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程。SQLite 直接读写普通磁盘文件。具有多个表、索引、触发器和视图的完整SQL数据库包含在单个磁盘文件中。

SQLite比MySQL还要轻量级,官方提供的程序包大约1MB。但是这么小的内容居然也是一个关系型数据库,所以SQLite也很适合作为入门数据库。其中,SQL最基础的功能就是查询了。

2. 详论

2.1. 打开/关闭数据库

使用数据库的第一步当然是打开数据库了。对于C接口来说,通常的实现是提供一个打开的接口,得到一个句柄或者指针,然后通过这个句柄或者指针进行进一步操作,包括关闭数据库操作。SQLite正是这么设计的:

int nRes = sqlite3_open("D:/test.db", &pDB);
  if (nRes != SQLITE_OK) {
    cout << "Open database fail: " << sqlite3_errmsg(pDB);
    return 1;
  }
  sqlite3_close(pDB);

通过sqlite3_open()这个函数打开数据库文件,如果数据库.db文件不存在,则会创建这个文件文件。一旦创建成功,在程序结束时最好调用sqlite3_close()这个函数进行关闭,否则会内存泄漏。如果需要更加精细的打开数据库文件控制,最好使用sqlite3_open_v2()这个接口:

int flags =
      SQLITE_OPEN_READWRITE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE;
  int nRes = sqlite3_open_v2("D:/test.db", &pDB, flags, nullptr);

sqlite3_open_v2()提供了很多打开数据库文件时的配置,例如如果需要在数据库文件不存在时进行创建,可以再加上SQLITE_OPEN_CREATE。

2.2. 数据查询

如果在可视化管理工具(例如SQLite Expert)中,无论是查询、插入、修改或者删除操作,都是直接输入SQL语句,然后执行运行操作,就可以得到相应的结果。SQLite也有这样的接口sqlite3_exec(),例如我们查询一个表中所有的数据:

char* cErrMsg;
  int res =
      sqlite3_exec(pDB, "select * from metadata;", ResultCallBack, 0, &cErrMsg);
  if (res != SQLITE_OK) {
    cout << "select fail: " << cErrMsg << endl;
    return false;
  }
  sqlite3_free(cErrMsg);

sqlite3_exec()是一个回调函数,每查询到一行数据就调用一次:

int ResultCallBack(void* NotUsed, int argc, char** argv,
                          char** azColName) {
  for (int i = 0; i < argc; i++) {
    cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << ", ";
  }
  cout << endl;
  return 0;
}

如果需要进行更加细粒度的控制,那么一个合适的做法是使用statement(语句)。首先,我们将我们需要的sql语句编译成数据库引擎识别的字节码,这个步骤可以叫做prepare(准备):

sqlite3_stmt* statement = nullptr;
  int ret = sqlite3_prepare_v2(pDB, sqlStr, -1, &statement, nullptr);
  if (ret != SQLITE_OK) {
    printf("prepare error ret : %d\n", ret);
    return 1;
  }

接着,就是执行准备好的SQL语句:

while (sqlite3_step(statement) == SQLITE_ROW) {        
      //...
  }

sqlite3_setp()每次查询一行记录,并且返回SQLITE_ROW;知道查询完成,就返回SQLIET_DONE。通过这种方式实现了一种类似迭代器的操作,循环遍历每个查询结果。

最后,我们对每一行查询的结果进行解析:

while (sqlite3_step(statement) == SQLITE_ROW) {
    cout << sqlite3_data_count(statement) << '\n';
    cout << sqlite3_column_text(statement, 0) << '\t'
         << sqlite3_column_text(statement, 1) << '\n';
  }

sqlite3_column_X是一系列函数,可以直接获取每一行相应列的数据类型。例如获取整型就是sqlite3_column_int。

另外,不要忘了关闭这个语句:

sqlite3_finalize(statement);

3. 参考

  1. SQLite3中核心C API

分类: 基础组件

标签: sqlite3 , sql , 数据库 , 查询


相关文章
|
算法 安全 网络安全
简单认识一下mbedTLS
简单认识一下mbedTLS
3178 0
|
数据可视化 数据挖掘 Python
【数据分析与可视化】利用Python对泰坦尼克号幸存者数据分析与可视化(附源码)
【数据分析与可视化】利用Python对泰坦尼克号幸存者数据分析与可视化(附源码)
1128 0
|
3月前
|
人工智能 运维 监控
你的 AI Agent 真的在受控运行吗?
以 OpenClaw 为案例,从行业威胁态势与运行时防护的固有局限出发,系统拆解 AI Agent 可观测体系的设计方法论:通过 Session 审计日志、应用日志与 OpenTelemetry 遥测三条数据管道,构建行为审计、威胁检测、成本管控与运维观测的完整闭环。
你的 AI Agent 真的在受控运行吗?
|
12月前
|
人工智能 API 定位技术
MCP全方位扫盲
MCP(Model Context Protocol)是由Anthropic提出的协议,旨在标准化大模型与外部数据源和工具的通信方式。其核心架构包括MCP Client(客户端)和MCP Server(服务端),通过标准化接口实现解耦,支持不同LLM无缝调用工具。相比传统方法,MCP简化了Prompt工程,减少定制代码,提升复用性。实际场景中,如天气查询或支付处理,MCP可智能调用对应工具,优化用户体验。MCP的核心价值在于标准化通信、统一工具描述及动态兼容性,成为大模型与外部服务的智能桥梁。
|
存储 数据可视化 NoSQL
Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置
Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置
4136 0
Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置
|
数据库连接 API 数据库
SQLite3 数据库 C语言API 打开函数sqlite3_open 详解
SQLite3 数据库 C语言API 打开函数sqlite3_open 详解
1069 0
|
存储 SQL 数据采集
一文带你了解数据库设计基础
什么是数据库设计? 数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。在数据库领域内,常常把使用数据库的各类系统统称为数据库应用系统。
4493 0
一文带你了解数据库设计基础
|
JavaScript iOS开发 MacOS
Jupyter模块Plotly及labextension插件的安装
Jupyter模块Plotly及labextension插件的安装
856 1
|
XML Java 应用服务中间件
tomcat学习一:tomcat 目录及配置文件学习 server.xml 等
这篇文章是关于Apache Tomcat服务器的目录结构、配置文件(特别是server.xml)的详细介绍和学习指南。
898 0
tomcat学习一:tomcat 目录及配置文件学习 server.xml 等