- A+
翻译来源于:SQLite C tutorial
SQLite 数据库
SQLite是一个嵌入式关系数据库引擎。它的开发人员称其为一个独立的,无服务器的,零配置的和事务性的SQL数据库引擎。目前它非常受欢迎,代码的拷贝量达到了数亿次。 SQLite已经在Solaris 10和Mac OS,Android或在iPhone中使用。Qt4库内置了对SQLite以及Python和PHP的支持。许多流行的应用程序在内部使用SQLite,如Firefox,Google Chrome或Amarok。
SQLite 3 命令行
sqlite3工具是基于终端的SQLite库的前端。它以交互方式评估查询并以多种格式显示结果。它也可以在脚本中使用。它有自己的一套元命令,包括.tables,.load,.databases或.dump 。想查看更多的命令,我们可以通过输入 .help 命令进行查看。
现在我们通过sqlite3命令去创建一个新的数据库:
1 |
sqlite3 test.db |
我们通过在sqlite3命令后边跟上一个参数 test.db,意思就是创建一个 test.db 数据库,如果这个文件在我们磁盘上存在,那就打开,如果不存在,sqlite3会自动创建。
打开 test.db 数据库后,我们就可以通过命令: .tables 去查看 test.db 中的数据表。
通过命令 .exit 退出sqlite3工具。通过 ls 命令,我们可以看到,sqlite3的确帮我们创建了一个 test.db 的数据库。
动态演示效果图:
下面我们开始今天的主题,用C/C++语言来调用SQLite 3的操作。
SQLite Version
在第一个示例代码中,我们将通过SQLite 3的API来获取SQLite数据库的版本信息。
version.c:
1 2 3 4 5 6 7 8 9 |
#include <sqlite3.h> #include <stdio.h> int main(void) { printf("%s\n", sqlite3_libversion()); return 0; } |
编译命令:
1 |
gcc -o version version.c -lsqlite3 |
运行结果:
1 2 |
[root@localhost sqlite3_tutorial]# ./version 3.21.0 |
说明:<sqlite3.h>这个头文件定义了SQLite库提供给客户端程序的接口。它包含定义,函数原型和注释。它是SQLite API的权威来源。
在第二个示例中,我们将通过SQL查询,来获取SQLite的版本:
query_version.c:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#include <sqlite3.h> #include <stdio.h> int main(void) { sqlite3 *db; sqlite3_stmt *res; int rc = sqlite3_open(":memory:", &db); if (rc != SQLITE_OK) { fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0); if (rc != SQLITE_OK) { fprintf(stderr, "Failed to fetch data: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } rc = sqlite3_step(res); if (rc == SQLITE_ROW) { printf("%s\n", sqlite3_column_text(res, 0)); } sqlite3_finalize(res); sqlite3_close(db); return 0; } |
1 2 3 4 |
[root@localhost sqlite3_tutorial]# gcc query_version.c -o query_version -lsqlite3 [root@localhost sqlite3_tutorial]# ./query_version 3.21.0 [root@localhost sqlite3_tutorial]# |
我们可以看到,通过SQL查询和通过SQLite3的API接口查询到的结果是一致的。
说明:
SQLITE_VERSION()查询用于获取SQLite库的版本
1 |
sqlite3 *db; |
sqlite3结构定义了一个数据库句柄。每个打开的SQLite数据库都由一个数据库句柄表示。
1 |
sqlite3_stmt *res; |
sqlite3_stmt结构表示一个单独的SQL语句。
1 |
int rc = sqlite3_open(":memory:", &db); |
sqlite3_open()函数打开一个新的数据库连接。它的参数是数据库名称和数据库句柄。
这个 :memory: 是一个特殊的数据库名称,使用它可以打开内存数据库。
该函数的返回码指示数据库是否成功打开。连接成功建立时返回SQLITE_OK。
1 2 3 4 5 6 7 |
if (rc != SQLITE_OK) { fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } |
如果返回代码指示错误,我们将消息打印到控制台,关闭数据库句柄,并终止程序。sqlite3_errmsg()函数返回错误的描述。无论打开时是否发生错误,都应通过将数据库连接句柄传递给sqlite3_close()函数来释放与数据库连接句柄关联的资源。
1 |
rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0); |
在执行SQL语句之前,必须首先使用sqlite3_prepare *函数之一将其编译为字节码。(不推荐使用sqlite3_prepare()函数)。
sqlite3_prepare_v2()函数有五个参数:
- 第一个参数是从sqlite3_open()函数获得的数据库句柄。
- 第二个参数是要编译的SQL语句。
- 第三个参数是以字节为单位测量的SQL语句的最大长度。传递-1会导致SQL字符串被读取到字符串结尾的第一个零终止符。根据文档,通过传递提供的SQL字符串的确切字节数可以获得一些小的性能优势。
- 第四个参数是语句句柄。如果sqlite3_prepare_v2()成功运行,它将指向预编译语句。
- 最后一个参数是指向SQL语句的未使用部分的指针。只有SQL字符串的第一条语句才被编译,所以参数指向的是未编译的内容。我们填写0,因为该参数对我们不重要。
成功时,sqlite3_prepare_v2()返回SQLITE_OK;否则返回错误代码。
1 2 3 4 5 6 7 |
if (rc != SQLITE_OK) { fprintf(stderr, "Failed to fetch data: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } |
这是sqlite3_prepare_v2()函数调用的错误处理代码。
1 |
rc = sqlite3_step(res); |
sqlite3_step()运行SQL语句。 SQLITE_ROW返回码表示还有另一行准备好。我们的SQL语句只返回一行数据,所以我们只调用一次这个函数。
1 |
sqlite3_finalize(res); |
sqlite3_finalize()函数销毁准备好的语句对象。
1 |
sqlite3_close(db); |
sqlite3_close()函数关闭数据库连接。
来自外部的引用: 1