Linux高级系统编程—SQLite数据库

1

主题

4

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2022-12-17 21:03:12 | 显示全部楼层
介绍一种小型的、基于嵌入式的数据库SQlite的基本使用。实际开发中遇到的数据库有很多,作为一种信息存储管理的工具,数据库可以基于不同的平台运行。数据库虽然类型不同,但都有着相同功能设计思想。本章将从两个方面来介绍SQlite数据库:首先讲解SQlite的操作命令,使读者可以熟练使用数据库完成基本的功能;然后介绍SQlite的C语言API,讲解SQlite数据的操作。
SQLite数据库
Ø SQLite数据库概述
数据库是在按照一定方式存储在一起,能与多个用户共享,与应用程序彼此独立的数据集合。用户可以对数据进行新增、查询、更新、删除等操作。
数据库主要分为以下两类:
1. 关系数据库
关系数据库是创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
典型的代表有Oracle、Microsoft SQL Server、MySQL等。
Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率较高。
SQL Server是微软开发的数据库产品,主要支持Windows平台。
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。
2. 非关系数据库
非关系数据库作为传统关系数据库的一个有效补充,它是针对特定场景,以高性能和使用便利为目的的功能特异化的数据库产品。
典型的代表有Berkeley DB、Redis、Memcached等。
Memcached是一个开源的、高性能的、具有分布式内存对象的缓存系统。它可以减轻数据库负载,加速动态的Web应用。
Redis是一个高性能的key-value数据库,很大程度上补偿了Memcached这类key-value存储的不足。与Memcached一样,为了保证效率,Redis的数据都是缓存在内存中,区别是Redis会周期性地把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
本次介绍的数据库SQlite属于轻量级数据库,只有几十KB,一般应用在嵌入式和移动设备中。SQLite的源代码是C,其源代码完全开放。它具有以下特性:(1)零配置,无须安装和管理配置;(2)储存在单一磁盘文件中的一个完整的数据库;(3)数据库文件可以在不同字节顺序的机器间自由共享;(4)支持数据库大小至2TB;(5)对数据的操作比目前流行的大多数数据库要快。
Ø SQLite数据库安装
目前,几乎所有版本的Linux操作系统都附带SQlite。因此,一般只需在终端上输入命令sqlite3检测是否安装即可,如下所示,SQlite版本3.7.9。


如果没有看到类似的结果,则意味着在当前Linux(ubuntu)系统上没有安装SQlite。可以直接进入SQlite官网进行下载。如图所示,进入在官网中选择Download选项。


选择下载选项之后,在SQlite 下载页中,直接寻找支持Linux系统的SQlite工具(.zip的压缩文件),如图所示,双击鼠标左键,直接下载即可。


等待下载结束之后,直接解压压缩包,解压文件如图所示。


将图中的文件一并放入到Linux系统中(本书采用ubuntu系统)的自定义文件夹中,如下所示。


完成上述过程之后,即可直接运行,无须再进行其他安装,如下所示。


上述SQlite数据库的安装方式,并没有实现真正意义上的安装。只是将一个已经编译成功的命令集工具,仅可以使用,但并没有在Ubuntu系统中安装SQlite以及SQlite API所需的库文件以及头文件。
如果选择长期使用或者需要SQlite的库文件实现SQlite的编程任务则可以选择下载SQlite Source Code。同样进入SQlite官网,如图所示。进入下载页中,选择Source Code源码选项,下载sqlite-autoconf-xxx.tar.gz,如图所示。



下载完成后,将其放置到Ubuntu的系统中,并执行解压,如下所示。


解压完成之后,进入解压好的目录中,首先执行./configure --prefix=/usr/local完成配置,并指定配置文件生成所在的目录。之后执行make进行编译,待编译结束后,执行make install进行安装即可,如下所示,只演示操作步骤。


Ø SQLite命令
SQlite可支持的操作命令很多,首先需要介绍一些系统命令,如需获得一些可使用的命令清单,可以在任何时候,在“sqlite>”后输入“. help”+ Enter键查看,如下所示(命令较多,只截取部分内容)。


SQlite数据库的系统命令,都是以“.”开头;普通的命令,都是以“;”结束。
SQlite系统命令如表所示。
命令功能
.help查看帮助信息
.quit退出数据库
.exit退出数据库
.databases查看数据库
.schema查看表的结构
.tables显示数据库中的所有表的名字
下面将从实际的工作角度出发,通过对简单的学生信息表的操作展示SQlite命令的使用。假设某小学的班级需要完成学生期末考试成绩信息的采集保存,学生信息如表所示(示例选取三位学生,仅做参考)。


将上述学生信息保存到数据库中,首先需要创建一个数据库,创建数据库的语法为“sqlite3 + xxx.db”,如下所示,本次将创建一个stu.db数据库。


此时进入命令输入状态,为了检测上述数据库stu.db是否创建成功,则输入上表中的命令“.databases”查看数据库。
如下所示。


根据查看结果得知数据库创建成功,接下来则需要在数据库中创建一张表(数据库可创建多个表),对应学生信息表11.2,创建表的命令格式为“create + table + 表名(字段名称1 字段类型,字段名称2 字段类型, ....);”。


创建学生信息表的操作如下所示,表名为“stu”,字段与表11.2中的选项匹配,包括学号、名字、性别、年龄、分数。


此时可以通过命令查看当前创建的表的信息和结构,如下所示。
创建表成功后,则需要将学生信息录入到表中,即插入一条记录。插入一条记录的命令格式为“insert + into + 表名 + values(字段值1,字段值2,...);”。具体的操作如下所示。


如果此时插入记录不需要对所有的字段赋值,则可以申明记录中需要赋值的字段名称即可,其命令格式为“insert + into + 表名(字段名称1,字段名称2)+ values(字段值1,字段值2);”。此时插入下一条学生信息,只录入部分内容,如下所示。


使用同样的方法,插入下一条记录,此时选择不录入“性别”(示例中的字段读者可自行选取,非固定,仅供参考),如下所示。


完成上述三条记录的插入之后,则需要查看数据库记录,看是否有信息录入,或者信息是否有错误。查看记录的命令格式为“select + * + from + 表名”,其中“*”表示所有。使用如下所示。


查询记录,也可选择条件查询,即查询某一条特定的记录。如果表中的信息较多,采用选择查询,则非常有效。选择查询的命令格式为“select + * + from + 表名 + where + 查询条件”。例如,本示例则选择查询年龄为8岁的学生信息,如下所示。


查询也可以更加精细,可选择利用不同的逻辑组合完成查询。


例如,查询年龄为8岁并且学号为1002的学生信息,如下所示。


查询学号从1001到1002的学生信息,如下所示。


有时不需要查询记录的全部信息,也可选择指定字段查询。例如,只查询学生的姓名与成绩,如下所示。


删除记录与查询比较类似,其命令格式为“delete + from + 表名 + where + 删除条件;”。例如,删除学号为1003并且姓名为WangWu的学生,并查询是否删除成功,使用如下所示。


如果表中的信息发送了变化,则需要对表中的记录进行更新。其命令格式为“update + 表名 + set + 修改字段 + 选择条件;”。例如,当前LiSi同学没有成绩,则需要更新成绩信息,为了避免同名,可选择学号与姓名查询。并且查询判断是否更新成功。


如果表中的信息,则需要增加某些字段信息。例如,学生信息表中需要增加提供家庭地址选项,则需要增加表中该字段。命令格式为“alter + table + 表名 + add + column + 字段名称 + 字段类型;”。
如下所示,增加地址字段并使用表11.1中系统命令查看表结构是否更新。


如果不需要该表,则将表中数据库中删除,删除表命令格式为“drop + table + 表名;”。同时使用删除表操作可实现删除字段的功能,因为SQlite数据库只有增加字段的操作,没有删除字段的功能。因此,删除某字段需要先创建一个新表,并从旧表中读出数据,然后删除旧表,并且对新表重命名即可(重命名为旧表的名称)。
例如,删除学生性别选项,具体使用如下。


至此,SQlite数据库的基本操作已讲解完毕,读者需要针对不同情况,有效地选择筛选条件,完成必要的操作即可。
ØSQLite API
Ø SQLite API介绍
11.1节中,通过一个简单示例,展示了SQlite命令的使用,实现数据库的基本操作。本节将介绍关于SQlite的编程接口,通过代码实现对SQlite数据库的操作。


sqlite3_open()函数用于打开由filename参数指定的SQlite数据库文件。其中,filename指定数据库文件,ppDb表示数据库连接句柄(指针),类似于文件描述符,与filename建立联系。函数成功运行之后返回SQLITE_OK,失败为错误码,可以由sqlite3_errmsg()函数打印。


sqlite3_errmsg()函数用来返回描述错误的提示。参数sqlite3*为数据库连接句柄,即sqlite3_open()的参数。


sqlite3_close()函数为关闭sqlite数据库,参数sqlite3*为数据库连接句柄。
执行数据库SQlite的操作的函数是sqlite3_exec,原型如下。


参数sqlite*为数据库连接句柄。参数sql为分号分隔的SQL执行语句。参数callback指向回调函数的指针,如果为NULL则不会调用回调。只有在使用查询语句时,才给回调函数传参。参数arg为callback传递参数。参数errmsg保存错误信息的地址。


在使用查询功能时,回调函数的功能为得到查询结果。参数arg为回调函数传递参数使用。参数ncolumn用于指定记录中包含的字段的数目。参数f_value为包含每个字段值的指针数组。参数f_name为包含每个字段名称的指针数组。
查询数据库的函数为sqlite3_get_table(),原型如下。


sqlite3_get_table()函数用于查询数据库,它会创建一个新的内存区域来存放查询的结果。参数zsql表示数据库的sql语句。参数pazResult为查询的结果。参数pnRow表示查询到符合条件的记录数。参数pnColumn表示查询到符合条件的字段数。参数pzErrmsg表示错误信息。


sqlite3_free_table()函数用于释放sqlite3_get_table()函数返回的结果表。参数result为sqlite3_get_table()函数返回的结果表指针。

Ø SQLite API使用
简单地介绍了有关于SQlite的编程接口,本节将通过上述接口完成编程示例,实现数据库的基本功能:增、删、改、查。
do_insert()子函数实现插入记录的功能;实现查询功能的方式有两种,分别为do_query()函数和do_query1()函数,两种方式内部实现的函数不同,一种通过sqlite3_exec()函数实现,另一种通过sqlite3_get_table()函数实现;do_delete()子函数实现根据ID判断删除记录;do_update()子函数实现了部分更新功能,即通过ID判断实现名字的修改,其他的修改将不再列出,只需按照名字修改的代码复制即可。  
注意数据库编程接口出自第三方库,因此编译时需要手动链接库文件-lsqlite3,否则则编译会失败。
运行结果如下所示,运行出现选择窗口,选择1添加记录,并按提示输入信息,则出现Insert done.表示添加记录成功。


用同样的方式添加LiSi的信息到数据库表中,如下所示。


此时选择2查询记录,则可显示表中的记录,包括选项名与对应的值。


选择4更新记录,选择修改ID为1002的名字为WangWu,查询修改成功,如下所示。


选择3删除记录,并查询删除成功,如下所示。


选择5则退出,如下所示。


小结:Linux高级系统编程—SQLite数据库
核心内容有两部分,一部分是SQlite的命令,另一部分则是SQlite的编程接口。通过命令或编程接口,可以实现数据库对数据增、删、改、查的基本功能。这两部分内容都属于简单难度,因此需要读者完全掌握并熟练使用SQlite数据库。通过学习内容能初步建立对数据库的认识。
回复

举报 使用道具

您需要登录后才可以回帖 登录 | 立即注册
快速回复 返回顶部 返回列表