目录
方法一:使用 sqlite3_exec() 的第三个参数(回调函数) 异步取值
方法三:通过sqlite3_prepare、sqlite3_step一系列操作
更多
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
为什么要用 SQLite?
- SQLite 不需要配置,SQLite是一个嵌入式SQL数据库引擎,这意味着不需要安装或管理。SQLite没有单独的服务器进程,意味着不能远程链接。
- 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。一个包含多个表、索引、触发器和视图的完整SQL数据库包含在单个磁盘文件中。数据库文件格式是跨平台的--可以在32位和64位系统之间或大端和小端架构之间自由复制数据库。SQLite直接读取和写入普通磁盘文件
- SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
- SQLite 是自给自足的,这意味着不需要任何外部的依赖。
- SQLite 事务是完全兼容 ACID(数据库事务正确执行的四个基本要素的缩写。包含:原子性、一致性、隔离性、持久性),允许从多个进程或线程安全访问。
- SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
- SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
- SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行
- 最大存储DB大小 281TB,比直接I/O操作更快
SQLite 局限性
在 SQLite 中,SQL92 不支持的特性如下所示:
特性 | 描述 |
RIGHT OUTER JOIN | 只实现了 LEFT OUTER JOIN。 |
FULL OUTER JOIN | 只实现了 LEFT OUTER JOIN。 |
ALTER TABLE | 支持 RENAME TABLE 和 ALTER TABLE 的 ADD COLUMN variants 命令,不支持 DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT。 |
Trigger 支持 | 支持 FOR EACH ROW 触发器,但不支持 FOR EACH STATEMENT 触发器。 |
VIEWs | 在 SQLite 中,视图是只读的。您不可以在视图上执行 DELETE、INSERT 或 UPDATE 语句。 |
GRANT 和 REVOKE | 可以应用的唯一的访问权限是底层操作系统的正常文件访问权限。 |
常用的点命令
Command Line Shell For SQLitehttps://www.sqlite.org/cli.html
大多数时候,sqlite3只是读取输入行并将其传递到SQLite库进行执行。但以点(.”)开头的输入被sqlite3程序本身拦截和解释。这些“点命令”通常用于更改查询的输出格式,或执行某些预打包的查询语句。最初只有几个点命令,但多年来积累了许多新功能,以至于今天有60多个。
查看可用的点命令
sqlite> .help
$sqlite3 xxx.db 打开或者创建一个新数据库
- sqlite> .open打开或者创建一个新数据库
- sqlite> .databases 列出数据库的名称及其所依附的文件
- sqlite> .tables 查看有哪些表
- sqlite> .schema ?TABLE? 显示 CREATE 语句。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表。
- sqlite> .output test.sql 发送输出到 FILENAME 文件。
- sqlite> .dump ?TABLE? 以 SQL 文本格式转储数据库。如果指定了 TABLE 表,则只转储匹配 LIKE 模式的 TABLE 表。(默认输出到屏幕)
- sqlite> .read test.sql 执行 FILENAME 文件中的 SQL。
导出sql语句到文件,同时执行文件中的sql语句到新数据库怎么做呢?
方法一:全部或指定?TABLE?
sqlite> .output FILENAME
sqlite> .dump ?TABLE?
sqlite> .read FILENAME
方法二:只能是全部
$sqlite3 test_source.db .dump > testDB.sql
$sqlite3 test_dest.db < testDB.sql
在 Linux 上安装 SQLite
目前,几乎所有版本的 Linux 操作系统都附带 SQLite。所以,只要使用下面的命令来检查您的机器上是否已经安装了 SQLite。
这种情况下可能机器中没有 sqlite3.h 和 libsqlite3.so
下载源码安装
SQLite Download Pagehttps://www.sqlite.org/download.html
$ tar xvzf sqlite-autoconf-3380500.tar.gz
$ ./configure --prefix=/usr/local
$ make
$ make install
sql语句
与关系数据库进行交互的标准 SQLite 命令类似于 SQL。命令包括 CREATE、SELECT、INSERT、UPDATE、DELETE 和 DROP。但也有一些区别,比如:
清空表同时重置表的自增量
mysql可使用Truncate Table语句,但是SQLite中不支持Truncate
SQLite中只能使用Delete来删除全部表数据。SQlite在为表创建自增列后,会将表自增列的当前序号保存到sqlite_sequence的表内,如果还要将自增列清零,则需处理此表相关记录。
sqlite_sequence表结构(其内seq字段为当前自增列的序号值,name字段为数据表名称)
CREATE TABLE sqlite_sequence(name, seq);
Eg.
delete from test_table;
Update sqlite_sequence set seq = 0 where name = ‘test_table’;
C/C++接口
序号 | API & 描述 |
1 | sqlite3_open(const char *filename, sqlite3 **ppDb) |
2 | sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *data, char **errmsg) |
3 | sqlite3_close(sqlite3*) |
查询到数据怎么取
方法一:使用 sqlite3_exec() 的第三个参数(回调函数) 异步取值
与调用 sqlite3_exec函数不在同一个函数,但还是在同一个线程
这个回调提供了一个从 SELECT 语句获得结果的方式。它声明如下:
typedef int (*sqlite3_callback)
(
void*, /* Data provided in the 4th argument of sqlite3_exec() */
int, /* The number of columns in row */
char**, /* An array of strings representing field values in the row */
char** /* An array of strings representing column names */
);
如果上面的回调在 sqlite_exec() 程序中作为第三个参数,那么 SQLite 将为 SQL 参数内执行的每个 SELECT 语句中处理的每个记录都会调用这个回调函数。
自己定义的回调函数:
static int callback(void *data, int columns , char **field_values, char **column_names)
{
fprintf(stderr, "%s: ", (const char*)data);
for(int i=0; i<columns ; i++)
{
printf("%s = %s\n", column_names[i], field_values[i] ? field_values[i] : "NULL");
}
printf("\n");
return 0;
}
方法二 :sqlite3_get_table 同步取值
SQLITE_API int sqlite3_get_table
(
sqlite3 *db, /* An open database */
const char *zSql, /* SQL to be evaluated */
char ***pazResult, /* Results of the query */
int *pnRow, /* Number of result rows written here */
int *pnColumn, /* Number of result columns written here */
char **pzErrmsg /* Error msg written here */
);
SQLITE_API void sqlite3_free_table(char **result);
方法三:通过sqlite3_prepare、sqlite3_step一系列操作
int sqlite3_prepare_v2
(
sqlite3*db, /* Database handle(数据库指针) */
const char*zSql, /* SQL statement, UTF-8encoded(使用UTF-8编码的SQL语句) */
int nByte, /* Maximum length of zSql inbytes.(如果nByte小于0,则函数 取出zSql中从开始到第一个0终止符的内容;如果nByte为非 负数,那么它就是这个函数能从zSql中读取的最大字节数。zSql 在第一次遇见/000或u000的时候终止) */
sqlite3_stmt *ppStmt, / *OUT:Statement handle(能够使用sqlite3_step()执行的编译好 的准备语句的指针,如果错误发生,它被置为NULL,例如输入 一个不正确的sql语句。调用过程必须负责在编译好的sql语句 完成使用后,调用sqlite3_finalize()删除它。 */
const char**pzTail /* OUT: Pointer to unusedportion of zSql(当zSql在遇见终止符 或者达到设定的nByte结束后,如果还有剩余的内容,那么这 些剩余的内容将被存放到pzTail中,不包含终止符) */
);
SQLITE_API int sqlite3_step(sqlite3_stmt*);
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
更多
SQLite Documentationhttps://www.sqlite.org/docs.html
SQLite 教程 | 菜鸟教程https://www.runoob.com/sqlite/sqlite-tutorial.html
凡是过往,即为序章