SQLite 数据库使用

SQLite 数据库使用

一、SQLite 数据库的安装(sqlite-3.5.6,Ubuntu)
1. wget http://www.sqlite.org/sqlite-3.5.6.tar.gz
2. tar -xzvf sqlite-3.5.6.tar.gz
3. cd sqlite-3.5.6
4. ./configure
5. make
6. make install

测试安装是否成功:
# ./sqlite3 text.db

如果安装成功,会出现下面这样的信息

SQLite version 3.5.6
Enter ".help" for instructions
sqlite

二、SQLite 数据库介绍
SQLite 是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如 BerkeleyDB、MemBASE 等,SQLite 可以很好的支持关系型数据库所具备的一些基本特征,如标准 SQL 语法、实务、数据表和索引等。事实上,尽管 SQLite 拥有诸多关系型数据库的基本特征,然而由于应用场景的不同,它们之间并没有更多的可比性。下面是 SQLite 的主要特征:
    1). 管理简单,甚至可以认为无需管理。
    2). 操作方便,SQLite 生成的数据库文件可以在各个平台无缝移植。
    3). 可以非常方便的以多种形式嵌入到其他应用程序中,如静态库、动态库等。
    4). 易于维护。
综上所述,SQLite 的主要优势在与灵巧、快速和可靠性高。SQLite 的设计者为了达到这一目标,在功能上作出了很关键性的取舍,与此同时,也失去了一些对 RDBMS 关键性功能的支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的 SQL 语句等。正式因为这些功能的牺牲才换来了简单,而简单又换来了高效性和高可靠性。

三、SQLite 数据库核心对象和接口
1. 核心对象:
在 SQLite 中最主要的两个对象是,database_connection 和 prepared_statement。database_connection 对象是由sqlite3_open() 接口函数创建并返回的,在应用程序使用任何其他 SQLite 接口函数之前,必须先调用该函数以便获得 database_connnection 对象,在随后的其他 APIs 调用中,都需要该对象作为输入参数以完成相应的工作。至于 prepare_statement,我们可以简单的将它视为编译后的 SQL 语句,因此,所有和 SQL 语句执行相关的函数也都需要该对象作为输入参数以完成指定的 SQL 操作。

2. 核心接口:
    1). sqlite3_open
    上面已经提到过这个函数了,它是操作 SQLite 数据库的入口函数。该函数返回的 database_connection 对象是很多其他 SQLite APIs 的句柄参数。注意,我们通过该函数既可以打开已经存在的数据库文件,也可以创建新的数据库文件。对于该函数返回的 database_connection 对象,我们可以在多个线程之间共享该对象的指针,以便完成和数据库相关的任意操作。然而在多线程情况下,我们更为推荐的使用方式是,为每个线程创建独立的 database_connection 对象。对于该函数还有一点也需要额外说明,我们没有必要为了访问多个数据库而创建多个数据库连接对象,因为通过 SQLite 自带的 ATTACH 命令可以在一个连接中方便的访问多个数据库。

    2). sqlite3_prepare
    该函数将 SQL 文本转换为 prepared_statement 对象,并在函数执行后返回该对象的指针。事实上,该函数并不会评估参数指定 SQL 语句,它仅仅是将 SQL 文本初始化为待执行的状态。最后需要指出的,对于新的应用程序我们可以使用sqlite3_prepare_v2 接口函数来替代该函数以完成相同的工作。

    3). sqlite3_step
    该函数用于评估 sqlite3_prepare 函数返回的 prepared_statement 对象,在执行完该函数之后,prepared_statement 对象的内部指针将指向其返回的结果集的第一行。如果打算进一步迭代其后的数据行,就需要不断的调用该函数,直到所有的数据行都遍历完毕。然而对于 INSERT、UPDATE 和 DELETE 等 DML 语句,该函数执行一次即可完成。

    4). sqlite3_column
    该函数用于获取当前行指定列的数据,然而严格意义上讲,此函数在 SQLite 的接口函数中并不存在,而是由一组相关的接口函数来完成该功能,其中每个函数都返回不同类型的数据,如:
    sqlite3_column_blob
    sqlite3_column_bytes
    sqlite3_column_bytes16
    sqlite3_column_double
    sqlite3_column_int
    sqlite3_column_int64
    sqlite3_column_text
    sqlite3_column_text16
    sqlite3_column_type
    sqlite3_column_value
    sqlite3_column_count
    其中 sqlite3_column_count 函数用于获取当前结果集中的字段数据。下面是使用 sqlite3_step 和 sqlite3_column 函数迭代结果集中每行数据的伪代码,注意这里作为示例代码简化了对字段类型的判断:

int fieldCount = sqlite3_column_count(...);
while (sqlite3_step(...) <> EOF) 
{
    for (int i = 0; i < fieldCount; ++i) 
    {
        int v = sqlite3_column_int(...,i);
    }
}

    5). sqlite3_finalize
    该函数用于销毁 prepared statement 对象,否则将会造成内存泄露。

     6). sqlite3_close
    该函数用于关闭之前打开的 database_connection 对象,其中所有和该对象相关的 prepared_statements 对象都必须在此之前先被销毁。

3.执行 Query:
    函数 sqlite3_exec() 提供了一种 SQL 命令的快速、简单的方法,它特别适合处理对数据库的修改操作(不需要返回数据),如:INSERT、UPDATE 和 DELETE。

    int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg ); 

    第 1 个参数不再说了,是前面 open 函数得到的指针。说了是关键数据结构。 
    第 2 个参数 const char *sql 是一条 sql 语句,以 /0 结尾。 
    第 3 个参数 sqlite3_callback 是回调,当这条语句执行之后,sqlite3 会去调用你提供的这个函数。
    第 4 个参数 void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填 NULL。
    第 5 个参数 char ** errmsg 是错误信息,注意是指针的指针,sqlite3 里面有很多固定的错误信息。执行 sqlite3_exec 之后,执行失败时可以查阅这个指针(直接 printf(“%s/n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec 函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样 sqlite3_exec 函数外面就可以通过这个 char* 得到具体错误提示。
    说明:通常,sqlite3_callback 和它后面的 void * 这两个位置都可以填 NULL。填 NULL 表示你不需要回调。比如你做 insert 操作,做 delete 操作,就没有必要使用回调。而当你做 select 时,就要使用回调,因为 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。 

sqlite3_exec() 的回调函数:
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 fields in the row */  ---- 字段值
    char** /* An array of strings representing column names */        ---- 字段名

);



之前参考过网上几篇不错的文章,但是现在没记起来是哪些,也没去翻了,请见谅。


http://www.cnblogs.com/stephen-liu74/archive/2012/03/09/2328757.html这是 SQLite 学习的一个不错的网站,里面还有实例。


sqlite可以在shell底下直接执行命令:
sqlite3 film.db "select * from film;"
输出 HTML 表格:
sqlite3 -html film.db "select * from film;"
将数据库「倒出来」:
sqlite3 film.db ".dump" > output.sql
利用输出的资料,建立一个一模一样的数据库(加上以上指令,就
在 sqlite 中运行 .sql 脚本:sqlite3 test.db < /var/waf/rules.sql

如果向sqlite3数据库中插入大量数据,速度会比较慢,这个时候可以进行优化,方式有两种:
1. 使用事务:(sql脚本)
BEGIN TRANSACTION;
INSERT INTO "rules" VALUES(1,..);
INSERT INTO "rules" VALUES(2,..);
........
INSERT INTO "rules" VALUES(1000000, ..);
COMMIT TRANSACTION;

2. 设置 synchronous 标志:
PRAGMA synchronous = OFF;         (放在sql文件的头部)

如果是python,使用事务就很简单了,只要在最后加上 conn.commit() 即可。如果直接在shell下运行,就用begin;commit; 即可。 

注意:

1. sqlite3_exec函数如果有返回错误信息,也就是第5个参数返回不为空,那就需要调用sqlite3_free函数去释放第5个参数的指针。

2. sqlite3_mprintf函数拼接完sql语句后也需要调用sqlite3_free函数去释放保存sql语句的空间。

3. sqlite3_column_text函数从数据库中获取字符串字段后,不需要调用sqlite3_free函数去释放保存字符串的空间,这块内存由sqlite3自己释放。

参考:

http://www.sqlite.org/capi3ref.html#sqlite3_exec

http://www.sqlite.org/capi3ref.html#sqlite3_mprintf

http://www.sqlite.org/c3ref/column_blob.html



博主所有文章已转自私人博客Joe 的个人博客,谢谢关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值