嵌入式Linux-SQLite数据库


SQLite数据库

数据库基本概念

数据(Data)

能够输入计算机并能被计算机程序识别和处理的信息集合

数据库 (Database)

数据库是在 数据库管理系统管理 和控制之下,存放在存储介质上的数据集合

常用的数据库

大型数据库

Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。
IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。

中型数据库

Server是微软开发的数据库产品,主要支持windows平台。

小型数据库

mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。

基于嵌入式的数据库

  • 基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDB
  • Firebird是关系型数据库,功能强大,支持存储过程、SQL兼容等
  • SQLite关系型数据库,体积小,支持ACID事务
  • Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中
  • eXtremeDB是内存数据库,运行效率高

SQLite 基础

  1. SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。
  2. SQLite有以下特性:
  • 零配置一无需安装和管理配置;
  • 储存在单一磁盘文件中的一个完整的数据库;
  • 数据库文件可以在不同字节顺序的机器间自由共享;
  • 支持数据库大小至2TB;
  • 足够小,全部源码大致3万行c代码,250KB;
  • 比目前流行的大多数数据库对数据的操作要快;

sqlite3数据库的安装

本地安装

libsqlite3-0_3.7.2-1ubuntu0.1_i386.deb
sqlite3_3.7.2-1ubuntu0.1_i386.deb
libsqlite3-dev_3.7.2-1ubuntu0.1_i386.deb

sudo dpkg -i  *.deb

在线安装

sudo apt-get install sqlite3

安装成功显示

在终端输入sqlite3,出现如下信息,表示安装成功

linux@linux:~/Desktop/SQL/test$ sqlite3 
SQLite version 3.7.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

创建数据库

  • 手工创建
    使用SQLite3工具,通过手工输入SQL命令行完成数据库创建.
    用户在Linux的命令行界面中输入SQLite3可启动SQLite3工具
  • 代码创建
    在代码中常动态创建数据库
    在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库

数据库常用命令介绍

系统命令,都以’ . '开头

显示所有命令
sqlite> .help 
退出sqlite3
sqlite> .quit 
显示当前打开的数据库文件
sqlite> .database
显示数据库中所有表名
sqlite>.table
显示数据库表的结构

sqlite>.schema

打开(创建)一个sqlite3数据库文件
  1. 在终端下运行sqlite3 <*.db>,出现如下提示符
    ·SQLite version 3.7.2
    ·Enter “.help” for instructions
    ·Enter SQL statements terminated with a “;”
    ·sqlite>

  2. <*.db> 是要打开的数据库文件。若该文件不存在,则自动创建

     linux@linux:~/Desktop/SQL/test$ sqlite3 student.db
     SQLite version 3.7.2
     Enter ".help" for instructions
     Enter SQL statements terminated with a ";"
    
     sqlite> .schema 
     CREATE TABLE stu(id integer, name char, socre integer);
     sqlite> .schema stu 
     CREATE TABLE stu(id integer, name char, socre integer);
     sqlite> 
    

SQL命令,不以".“开头,但以”;"结束

创建一张表

语法格式

create table 表名 (字段名1 字段类型1, 字段名2 字段类型2, …) ;

代码示例

sqlite> create table stu (id integer, name char, socre integer);
sqlite> .schema 
CREATE TABLE stu (id integer, name char, socre integer);
向表中添加新记录

语法格式

insert into 表名 (字段1, 字段2, …) values (字段1的值, 字段2的值, …) ; 

代码示例

sqlite> insert into stu values(1001,"张三",88);
sqlite> insert into stu values(1002,"李四",88);
sqlite> insert into stu values(1002,"王五",88);
sqlite> insert into stu values(1002,"赵六",88);
  • 添加一条记录的部分字段

     sqlite> insert into stu (name, socre)values("王五",96);
     sqlite> select * from stu;
     1001|张三|88
     1002|李四|88
     1002|王五|88
     1002|赵六|88
     |王五|96
    
查询表中记录
  • 查询所有字段
    语法格式
    sqlite>select * from <table_name>;

      sqlite> select * from stu;
      1001|张三|88
      1002|李四|88
      1002|王五|88
      1002|赵六|88
      |王五|96
    
  • 查询指定的字段
    select name,score from <table_name>;

      sqlite> select name from stu;
      张三
      李四
      王五
      赵六
      王五
      sqlite> select id  from stu;
      1001
      1002
      1002
      1002
    
  • 按条件查询数据库中的内容
    sqlite>select * from <table_name> where < expression>
    select * from stu where score = 80;
    select * from stu where score = 80 and name= ‘张三’;
    select * from stu where score = 80 or name=‘王五’;
    select * from stu where score >= 85 and score < 90;

      select * from stu where id = 1001 ;
      1001|张三|88
    
      select * from stu where socre = 88 ;
      1001|张三|88
      1002|李四|88
      1002|王五|88
      1002|赵六|88
    
按指定条件删除表中记录

语法格式

sqlite>delete  from  <table_name>  where  <expression>

不加where会删除整张表

sqlite> select * from stu;
1001|张三|88
1002|李四|88
1002|王五|88
1002|赵六|88
|王五|96
sqlite> delete from stu where name="王五"and socre=96 ;
sqlite> select * from stu;
1001|张三|88
1002|李四|88
1002|王五|88
1002|赵六|88
更新表中记录(修改)

语法格式

sqlite>update  <table_name>  set  <f1=value1>, <f2=value2>…   where  <expression>;  

sqlite> update stu set id=1012 where name="王五";
sqlite> select * from stu;
1001|张三|88
1002|李四|88
1012|王五|88
1002|赵六|88
在表中添加字段

语法格式

sqlite>alter table <table>  add column <field> <type> default  …; 

sqlite> alter table stu add column address char;
sqlite> .schema 
CREATE TABLE stu (id integer, name char, socre integer, address char);
sqlite> update stu set address="北京"; 
sqlite> select * from stu;
1001|张三|88|北京
1002|李四|88|北京
1012|王五|88|北京
1002|赵六|88|北京
在表中删除字段

语法格式
Sqlite中不允许删除字段,可以通过下面步骤达到同样的效果

  1. sqlite> create table stu as select no, name, score from student //创建一张新的表

  2. sqlite> drop table student // 删除原有的表

  3. sqlite> alter table stu rename to student // 将新的表的名字改成原有的旧表名字

     sqlite> create table stu1 as select id,name,socre,address from stu;
     sqlite> .table 
     stu   stu1
     sqlite> drop table stu;
     sqlite> alter table stu1 rename to stu; 
     sqlite> select *from stu;
     1001|张三|88|北京
     1002|李四|88|北京
     1012|王五|88|北京
     1002|赵六|88|北京
    
删除表

语法格式
sqlite>drop table <table_name>

SQLite编程接口

打开(或创建)sqlite数据库

 int sqlite3_open(
      const char *filename,   /* Database filename (UTF-8) */
      sqlite3 **ppDb          /* OUT: SQLite db handle */
     );
  • 参数:
    filename:数据库文件路径
    ppDb: 指向sqlite句柄的指针(数据库的操作句柄)

  • 返回值
    如果成功打开(和/或创建)数据库,则 返回SQLITE_OK。否则返回错误代码

      int sqlite3_open(
        const char * filename,/ *数据库文件名(UTF-8)* /
        sqlite3 ** ppDb / * OUT:SQLite数据库句柄* /
      );
      int sqlite3_open16(
        const void * filename,/ *数据库文件名(UTF-16)* /
        sqlite3 ** ppDb / * OUT:SQLite数据库句柄* /
      );
      int sqlite3_open_v2(
        const char * filename,/ *数据库文件名(UTF-8)* /
        sqlite3 ** ppDb,/ * OUT:SQLite数据库句柄* /
        int flags,/ *标志* /
        const char * zVfs / *要使用的VFS模块的名称* /
      );
    

关闭数据库sqlite数据库

int   sqlite3_close(sqlite3 *db);
  • 功能:关闭sqlite数据库
  • 返回值:成功返回0,失败返回错误码

得到错误信息的描述

const  char  *sqlite3_errmg(sqlite3 *db);         
  • 返回值:返回错误信息

执行SQL操作

typedef  int (*sqlite3_callback)(void *, int, char **, char **);
int sqlite3_exec(sqlite3 *db, const  char  *sql, sqlite3_callback callback, void *, char **errmsg);
  • 功能:执行SQL操作

  • db:数据库句柄

  • sql:SQL语句

  • callback:回调函数

  • errmsg:错误信息指针的地址

  • 返回值:成功返回0,失败返回错误码

      typedef  int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
    
  • 功能:每找到一条记录自动执行一次回调函数

  • para:传递给回调函数的参数

  • f_num:记录中包含的字段数目

  • f_value:包含每个字段值的指针数组

  • f_name:包含每个字段名称的指针数组

  • 返回值:成功返回0,失败返回-1

不使用回调函数执行SQL语句(操作)

int   sqlite3_get_table(sqlite3 *db, const  char  *sql,  char ***resultp,  int*nrow,  int *ncolumn, char **errmsg);
  • 功能:执行SQL操作
  • db:数据库句柄
  • sql:SQL语句
  • resultp:用来指向sql执行结果的指针
  • nrow:满足条件的记录的数目
  • ncolumn:每条记录包含的字段数目
  • errmsg:错误信息指针的地址
  • 返回值:成功返回0,失败返回错误码

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>



#define DATABASE "./student.db"
#define N 128 


int do_insert(sqlite3 *db);
int do_query(sqlite3 *db);
int do_delete(sqlite3 *db);
int do_update(sqlite3 *db);

int main(int argc, const char *argv[])
{
	
	sqlite3 *db;
	
	//创建数据库
	if(sqlite3_open(DATABASE, &db) != SQLITE_OK )
	{
		printf("%s\n",sqlite3_errmsg(db));
		return -1;
	}
	else
	{
		printf(" Open DATABASE Success \n");
	}
	
	char *errmsg = NULL;

	//创建一张数据库的表格
	if(sqlite3_exec(db, "create table if not exists stu(id int, name char, sex char, score int);", NULL, NULL, &errmsg) != SQLITE_OK)
	{
		printf("%s\n",errmsg);
	}
	else
	{
		printf("Create or Open Table Success.\n");
	}
	
	int input_cmd;

	while(1)
	{
		printf("********************************************\n");
		printf("1: insert  2:query  3:delete 4:update 5:quit\n");
		printf("********************************************\n");
		printf("Please select:");
		scanf("%d", &input_cmd);
		getchar();


		switch(input_cmd)
		{
			case 1:
				do_insert(db);
				break;
			case 2:
				//do_query(db);
				do_query1(db);
				break;
			case 3:
				do_delete(db);
				break;
			case 4:
				do_update(db);
				break;
			case 5:
				printf("main exit \n");
				sqlite3_close(db);
				exit(0);
				break;
			default:
				printf("Input Error Cmd !!!\n ");
				break;
		}
	
	}
	return 0;
}


int do_insert(sqlite3 *db)
{
	int id;
	
	printf("Input id:"); 
	scanf("%d",&id);

	char name[32] = {};
	
	printf("Input name:");
	scanf("%s",name);
	
	char sex[10] = {};
	
	printf("Input sex:");
	scanf("%s",&sex);

	int score;
	
	printf("Input score:");
	scanf("%d",&score);
	
	char sql[N] = {};
	
	sprintf(sql,"insert into stu values(%d,'%s','%s','%d');", id, name, sex, score);
	
	char *errmsg = NULL;

	if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		printf("%s\n", errmsg);
	}
	else
	{
		printf("Insert done\n");
	}

	return 0;
}

int callback(void* arg,int ncolumns ,char** f_value,char** f_name)
{
	int i=0;
	
//	printf("col = %d\n",ncolumns);	

	for(i=0; i<ncolumns; i++)
	{
		printf("%-10s",f_value[i]);
	}
	putchar(10);
	puts("--------------------------");

	return 0;
}

int do_query(sqlite3 *db)
{
	int id;
	char *errmsg = NULL;
	char sql[N] = {};
#if 0
	
	printf("Input id:");
	scanf("%d",*id);
	getchar();
	sprintf(sql, "select * from stu where id = %d;",id);

#endif
	sprintf(sql, "select * from stu;");
	
	if(sqlite3_exec(db, sql,callback, NULL, &errmsg) != SQLITE_OK)
	{
		printf("%s, %d--->%s\n", __func__, __LINE__, errmsg);
	}
	else
	{
		printf("Query done.\n");		
	}

	return 0;

}

int do_query1(sqlite3 *db)
{
	char** resultp;
	char *errmsg;
	int nrow;
	int ncolumn;

	if(sqlite3_get_table(db, "select * from stu;", &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK)
	{
		printf("%s\n",errmsg);
		return -1;
	}
	else
	{
		printf("query done.\n");
	}

	int i = 0;
	int j = 0;
	int index = ncolumn;

	for(j=0; j<ncolumn; j++)
	{
		printf("%-10s",resultp[j]);
	}
	putchar(10);

	for(i=0; i<nrow; i++)
	{
		for(j=0; j<ncolumn; j++)
		{
			printf("%-10s",resultp[index++]);
		}

		putchar(10);
	}

	return 0;
}

int do_delete(sqlite3 *db)
{
	int id;
	char sql[N] = {};
	char *errmsg;

	printf("Input id:");
	scanf("%d",&id);
	getchar();

	sprintf(sql,"delete from stu where id = %d;", id);

	if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		printf("%s\n",errmsg);
	}
	else
	{
		printf("Delete done.\n");
	}

	return 0;
}
int do_update(sqlite3 *db)
{
	char *errmsg;
	char sql[N] = {};
	int id;
	int score;

	printf("Input id:");
	scanf("%d",&id);
	getchar();

	printf("Input score:");
	scanf("%d",&score);
	getchar();

	sprintf(sql,"update stu set score = %d where id = %d",score, id);

	if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		printf("%s\n", errmsg);
	}
	else
	{
		printf("update done.\n");
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值