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 , 数据库 , 查询


相关文章
|
2月前
|
SQL 数据库 C语言
sqlite3使用入门
本文介绍了SQLite3数据库的安装与使用方法。首先通过`sudo apt install sqlite3`进行安装,并用`sqlite3 --version`验证版本。启动SQLite3后,使用`.help`查看系统维护命令,如`.database`列出数据库、`.tables`列出表等。通过标准SQL语句创建、查询、更新和删除表及数据。示例代码展示了如何使用C语言进行数据库操作,包括打开、创建表、插入数据、查询、更新和删除等基本功能。此外,还介绍了SQLite3的事务处理机制及其重要特性。
|
3月前
|
SQL Java 数据库连接
SQLite3使用笔记(2)——插入
SQLite3使用笔记(2)——插入
68 0
|
6月前
|
存储 SQL 关系型数据库
SQLite 简介
SQLite 简介
|
存储 Unix Shell
sqlite基础
sqlite基础
169 0
|
物联网 Linux 数据库
SQLite 数据表的创建与查看 | 学习笔记
快速学习 SQLite 数据表的创建与查看
SQLite 数据表的创建与查看 | 学习笔记
|
数据库 数据库管理
SQLite编程时列出所有在数据库中创建的表
因为所有的点命令只在 SQLite 提示符中可用,所以当您进行带有 SQLite 的编程时,您要使用下面的带有 sqlite_master 表的 SELECT 语句来列出所有在数据库中创建的表:
100 0
|
SQL Oracle 关系型数据库
玩转SQLite1:SQLite简介与安装
SQLite,是一个C语言库,诞生于2000年,它实现了一个小型、 快速、 自包含、 高可靠性的SQL数据库引擎,与其他数据库管理系统(如SQL Server或Oracle)的一大区别,是它非常的轻量级(小于500Kb大小)。
玩转SQLite1:SQLite简介与安装
|
SQL 数据库 数据库管理
SQL:sqlite3数据库常用操作
SQL:sqlite3数据库常用操作
188 0
|
数据库 数据库管理 数据库连接