sqlite 使用

目录

 

为什么要用 SQLite?

SQLite 局限性

常用的点命令

在 Linux 上安装 SQLite

sql语句

C/C++接口

查询到数据怎么取

方法一:使用 sqlite3_exec() 的第三个参数(回调函数) 异步取值

方法二 :sqlite3_get_table 同步取值

方法三:通过sqlite3_prepare、sqlite3_step一系列操作

​​​​​​​​​​​​更多​​​​​​​

 SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

为什么要用 SQLite?

  1. SQLite 不需要配置,SQLite是一个嵌入式SQL数据库引擎,这意味着不需要安装或管理。SQLite没有单独的服务器进程,意味着不能远程链接。
  2. 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。一个包含多个表、索引、触发器和视图的完整SQL数据库包含在单个磁盘文件中。数据库文件格式是跨平台的--可以在32位和64位系统之间或大端小端架构之间自由复制数据库。SQLite直接读取和写入普通磁盘文件
  3. SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
  4. SQLite 是自给自足的,这意味着不需要任何外部的依赖。
  5. SQLite 事务是完全兼容 ACID(数据库事务正确执行的四个基本要素的缩写。包含:原子性、一致性、隔离性、持久性),允许从多个进程或线程安全访问。
  6. SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
  7. SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
  8. SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行
  9. 最大存储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 打开或者创建一个新数据库

  1. sqlite> .open打开或者创建一个新数据库
  2. sqlite> .databases 列出数据库的名称及其所依附的文件
  3. sqlite> .tables  查看有哪些表
  4. sqlite> .schema ?TABLE? 显示 CREATE 语句。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表。
  5. sqlite> .output test.sql 发送输出到 FILENAME 文件。
  6. sqlite> .dump ?TABLE? 以 SQL 文本格式转储数据库。如果指定了 TABLE 表,则只转储匹配 LIKE 模式的 TABLE 表。(默认输出到屏幕)
  7. 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

$ cd sqlite-autoconf-3380500

$ ./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)
该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。
如果 filename 参数是 NULL 或 ':memory:',那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。
如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。

2

sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *data, char **errmsg)
该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。
在这里,第一个参数 sqlite3 是打开的数据库对象,sqlite_callback 是一个回调,data 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误。
sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。

3

sqlite3_close(sqlite3*)
该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。
如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。

查询到数据怎么取

方法一:使用 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


凡是过往,即为序章  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值