嵌入式数据库-Sqlite3

阅读引言: 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例, 相信仔细学习完这篇内容之后大家一定能有所收获。

目录

一、数据库的基础知识

1.数据库的基本概念

2.常用数据库

3.嵌入式数据库

4.sqlite3基础

5.创建数据库

6.数据库的相关术语

二.Sqlite3安装

三、Sqlite3命令

四、Sqlite3语句

五、Sqlite编程接口

六、代码实例

七、简单总结


一、数据库的基础知识

1.数据库的基本概念

数据(Data):能够输入计算机并能被计算机程序识别和处理的信息集合

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

2.常用数据库

大型数据库:

Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。

IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。

中型数据库:

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

小型数据库:

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

3.嵌入式数据库

基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDBFirebird是关系型数据库,功能强大,支持存储过程、SQL兼容等SQLite关系型数据库,体积小,支持ACID事务

Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中eXtremeDB是内存数据库,运行效率高

4.sqlite3基础

SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。

SQLite有以下特性:

  • 零配置无需安装和管理配置;
  • 储存在单一磁盘文件中的一个完整的数据库;
  • 数据库文件可以在不同字节顺序的机器间自由共享;
  • 支持数据库大小至2TB;
  • 足够小,全部源码大致3万行c代码,250KB;
  • 比目前流行的大多数数据库对数据的操作要快;

5.创建数据库

手工创建:

使用SQLite3工具,通过手工输入SQL命令行完成数据库创建,用户在Linux的命令行界面中输入SQLite3可启动SQLite3工具

代码创建:

在代码中常动态创建数据库,在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库

6.数据库的相关术语

数据库的相关术语有很多,以下是一些常见的数据库术语:

  1. 数据库(Database):数据的集合,按照一定的数据模型组织和存储的集合。

  2. 表(Table):用于存储数据的二维数据结构,由行(Record)和列(Field)组成。

  3. 行(Record):表中的一条数据,也被称为记录或元组。

  4. 列(Field):表中的一个属性,也被称为字段或列名。

  5. 主键(Primary Key):表中用于唯一标识每条记录的字段或字段组合。

  6. 外键(Foreign Key):表中用于建立与其他表之间关联关系的字段。

  7. 索引(Index):加速数据检索的数据结构,通过对关键字段建立索引,可以快速定位数据。

  8. 查询(Query):从数据库中检索数据的操作,通过使用SQL语言编写查询语句来实现。 9. SQL(Structured Query Language):结构化查询语言,用于管理和操作关系型数据库的标准语言。

  9. 视图(View):虚拟表,基于一个或多个表的查询结果创建的,可以简化复杂的查询操作。

  10. 触发器(Trigger):与表相关联的特殊类型的存储过程,在插入、更新或删除数据时自动触发执行。

  11. 事务(Transaction):一组数据库操作,要么全部执行成功,要么全部回滚,保证数据的一致性和完整性。

  12. 归范式(Normalization):为了避免数据冗余和不一致,对数据模型进行优化的过程。常见的归范式有第一范式(1NF)、第二范式(2NF)和第三范式(3NF)等。

  13. 关系数据库管理系统(RDBMS):用于存储、管理和操作关系型数据库的软件系统,例如MySQL、Oracle、SQL Server等。 这些术语是数据库领域中常用的,理解这些术语可以帮助你更好地了解和使用数据库。

15.数据库管理者(database administrator)

二.Sqlite3安装

bash 复制代码
sudo apt-get install
bash 复制代码
dpkg -s sqlite3

按道理来讲, 到这一步就结束了, 但是在实际的代码编译中, 找不到sqlite3.h头文件, 也链接不到对应的sql接口的实现。大家安装完可以先去/usr/include目录下看有没有对应的头文件, 没有的话这样干。安装sqlite3的库包。

bash 复制代码
sudo apt-get install libsqlite3-dev

三、Sqlite3命令

注意都以'.'开头

.exit 退出

.quit 退出

.table 查看表

.schema 查看表的结构

.open databasename 打开数据库

.help 命令帮助

简单演示

四、Sqlite3语句

1-- 创建一张表

create table stuinfo(id integer, name text, age integer, score float);

2-- 插入一条记录

insert into stuinfo values(1001, 'zhangsan', 18, 80);

insert into stuinfo (id, name, score) values(1002, 'lisi', 90);

3-- 查看数据库记录

select * from stuinfo;

select * from stuinfo where score = 80;

select * from stuinfo where score = 80 and name= 'zhangsan';

select * from stuinfo where score = 80 or name='wangwu';

select name,score from stuinfo; 查询指定的字段

select * from stuinfo where score >= 85 and score < 90;

4-- 删除一条记录

delete from stuinfo where id=1003 and name='zhangsan';

5-- 更新一条记录

update stuinfo set age=20 where id=1003;

update stuinfo set age=30, score = 82 where id=1003;

6-- 删除一张表

drop table stuinfo;

7-- 增加一列

alter table stuinfo add column sex char;

8-- 删除一列

create table stu as select id, name, score from stuinfo; 复制除了要删除的那一列,

drop table stuinfo; //删除原来的表

alter table stu rename to stuinfo; //把新建的表改为原来的表名

设置主键并且该主键是自增的, 主键的意思就是唯一的意思, 比如一张表中的id号, 身份证号啥的。

create table info(id integer primary key autoincrement, name vchar);

简单演示

五、Sqlite编程接口

  • int sqlite3_open(char *path, sqlite3 **db)
    • 功能:打开sqlite数据库
    • path:数据库文件路径
    • db:指向sqlite句柄的指针
    • 返回值:成功返回0,失败返回错误码(非零值)
  • int sqlite3_close(sqlite3 *db);
    • 功能:关闭sqlite数据库
    • 返回值:成功返回0,失败返回错误码
  • const char *sqlite3_errmg(sqlite3 *db);
    • 返回值:返回错误信息
  • 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,失败返回错误码

六、代码实例

实例软件结构如下:

Makefile

bash 复制代码
OBJ=$(wildcard ./*.c)
all:$(OBJ)
	gcc *.c -o test -lsqlite3

main.c

cpp 复制代码
#include "sqlite_method.h"


/* hint user input */
void hint_display();

/* main */
int main(int argc, const char *argv[])
{
	sqlite3 *db;
	char *errmsg;
	char input;

	if(sqlite3_open(DATABASE_PATH, &db) != SQLITE_OK) {
		printf("%s\n", sqlite3_errmsg(db));
		return -1;
	} else {
		printf("open database [%s] success\n", DATABASE_PATH);
	}

	
	if(sqlite3_exec(db, "create table if not exists exercise(id integer, name text, score integer);", \
						NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("sqlite3_exec failed, line: %d\n", __LINE__);
	}

	/* handle user input */
	while(1) {
		hint_display();	
		scanf("%c", &input);
		switch(input) {
		case 'i':
			insert_handle(db);
			getchar();
			break;
		case 'd':
			delete_handle(db);
			getchar();
			break;
		case 'q':
			query_handle(db);
			getchar();
			break;
		case 'u':
			update_handle(db);
			getchar();
			break;
		case '!':
			quit_handle(db);
			getchar();
			break;
		default:
			printf("invalid option!\n");
		}
	}


	return 0;
}

void hint_display()
{
	printf("**********************************************************\n");
	printf("*i: insert   d: delete    q: query    u: update    !:exit*\n");
	printf("**********************************************************\n");
}

sqlite_method.h

cpp 复制代码
#ifndef _SQLITE_METHOD_H_
#define _SQLITE_METHOD_H_

/*Author: Hewei
 *Date: 2024-3-30
 *Brife: database operator
 * */

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

#define DATABASE_PATH "./exercise.db"
#define N 256

void insert_handle(sqlite3 *db);
void delete_handle(sqlite3 *db);
void query_handle(sqlite3 *db);
void update_handle(sqlite3 *db);
void quit_handle(sqlite3 *db);





#endif

sqlite_method.c

cpp 复制代码
#include "sqlite_method.h"


void insert_handle(sqlite3 *db)
{
	int id;
	char name[128] ={0};
	int score;
	char buff[N] = {0};
	char *errmsg;

	printf("Please input id:");
	scanf("%d", &id);
	printf("Please input name:");
	scanf("%s", name);
	
	//getchar();          method 1
	printf("Please input score:");
	//scanf("% c%d", &score);       method 2
	scanf("%*c%d", &score);

	sprintf(buff, "insert into exercise values(%d, '%s', %d)", id, name, score);

	if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("%s\n", errmsg);
	} else {
		printf("\n\n\n");
		printf("insert operator success!|\n");
	}
	
}

void delete_handle(sqlite3 *db)
{
	int id;
	char buff[N] = {0};
	char *errmsg;

	printf("Please input delete id:");
	scanf("%d", &id);
	snprintf(buff, sizeof(buff), "delete from exercise where id = %d", id);


	if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("%s\n", errmsg);
	} else {
		printf("\n\n\n");
		printf("delete operator success!|\n");
	}

}

int query_callback(void *arg, int f_num, char **value, char **name) 
{
	 int i;
	 static int count = 0;
	 if(count == 0) {
		for(i = 0; i < f_num; i++) {
			printf("%-10s", name[i]);	
		}
		count = 1;
		putchar(10);
	 }
	for(i = 0; i < f_num; i++) {
		printf("%-10s", value[i]);
	}
	puts("");

	return 0;
}


void query_handle(sqlite3 *db)
{	
	char buff[N] = {0};
	char *errmsg;

	sprintf(buff, "select * from exercise");
	if(sqlite3_exec(db, buff, query_callback, NULL, &errmsg) != SQLITE_OK) {
		printf("%s\n", errmsg);
	} else {
		printf("\n\n\n");
		printf("query operator success!|\n");
	}
	
}



void update_handle(sqlite3 *db)
{
	char buff[128];
	char *errmsg;
	int id, score;

	printf("Please input you want update id:");
	scanf("%d", &id);
	printf("Please input you want update score:");
	scanf("%d", &score);

	
	sprintf(buff, "update exercise set score = %d where id = %d\n", score, id);

	if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("%s\n", errmsg);
	} else {
		printf("\n\n\n");
		printf("update operator success!\n");
	}
}

void quit_handle(sqlite3 *db)
{
	printf("\n\n\n");
	printf("database os exit success!\n");
	sqlite3_close(db);
	exit(1);
}

七、简单总结

  1. 关系型数据库其实就是execl那种类似的表格, 不是什么高深的东西

  2. Sqlite3的特点: 体积小、简单、高效、本地存储、源码开放。

好了, 老规矩希望对有需要的人有帮助。因为这个我实现得不是很规范,看不懂的地方随时欢迎私信。

相关推荐
江上挽风&sty1 分钟前
【Django篇】--动手实践Django基础知识
数据库·django·sqlite
向阳12185 分钟前
mybatis 动态 SQL
数据库·sql·mybatis
胡图蛋.6 分钟前
什么是事务
数据库
小黄人软件9 分钟前
20241220流水的日报 mysql的between可以用于字符串 sql 所有老日期的,保留最新日期
数据库·sql·mysql
张声录114 分钟前
【ETCD】【实操篇(三)】【ETCDCTL】如何向集群中写入数据
数据库·chrome·etcd
无为之士20 分钟前
Linux自动备份Mysql数据库
linux·数据库·mysql
小汤猿人类33 分钟前
open Feign 连接池(性能提升)
数据库
阳冬园1 小时前
mysql数据库 主从同步
数据库·主从同步
Mr.132 小时前
数据库的三范式是什么?
数据库
Cachel wood2 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架