Linux:SQLite基本使用及C语言示例

SQLite基本使用及C语言示例

1、简介

sqlite3在2000年诞生,体积小(约250KB,3万行代码),是其他大型数据库的阉割版,集成了绝大多数的功能,但不是严格的数据类型匹配、不支持数据类型检测。轻量级的数据库,支持数据库大小至2TB,比目前流行的大多数数据库对数据操作要快。


2、安装(大部分Linux发行版本已经默认自带)

sudo apt-get install sqlite3

3、终端上的操作命令

3.1 进入sqlite3
sqlite3
3.2 系统命令(以“.”开头)
命令功能
.help帮助
.quit退出
.exit退出
.schema查看表的结构图
.database查看路径
.table查看数据库表
3.3 SQL基本命令(不以“.”开头,而是以“;”结尾)
创建数据库
sqlite3 student.db
创建一张数据库表stu,变量在前类型在后(char也可表示字符串)
create table stu(id Integer, name char, score Integer);
插入一组数据(char类型使用单引号和双引号都可以)
insert into stu values(1001, 'zhangsan', 80);		// 所有值
insert into stu values(1002, "zhangsan2", 90);		
insert into stu (id, name)values(1003, 'lisi');		// 插入部分值
查看
select * from stu;									// 查看所有
select name from stu;								// 查看指定部分
select id, name from stu;
select * from stu where score=80;
select * from stu where score=80 and id=1001;
select * from stu where score=80 or score=90;
删除
delete from stu;									// 删除所有
delete from stu where name='zhangsan';				// 删除指定
delete from stu where name='zhangsan' and id=1001;
delete from stu where name='zhangsan' or id=1001;
更新(修改)
update stu set name='wangwu' where id=1001;			// 将id为1001改名为wangwu
update stu set name="wangwu", score=85 where id=1001;
添加列
alter table stu add column address char; 			// 添加列(这里是address)
删除列(sqlite不支持删除列,可以制作新的表再删除旧的)

以删除address列为例:

create table stu1 as select id, name, score from stu;	// 拷贝成新的数据库
drop table stu;											// 删除旧的数据库
alter table stu1 rename to stu;							// 将新的数据库改名

4、C语言API接口

参考:https://sqlite.org/c3ref/funclist.html

① 打开数据库
int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

参数:filename 数据库路径名;

   ppDb 数据库操作句柄(传出)。

返回:成功返回SQLITE_OK;

   失败设置错误码,可用sqlite3_errmsg函数获取描述

② 关闭数据库
int sqlite3_close(sqlite3 *db);

参数:db 操作数据库的指针句柄;

返回:成功返回SQLITE_OK;失败则设置错误码

③ 查看错误信息
const char *sqlite3_errmsg(sqlite3 *db);

参数:db 操作数据库的指针句柄;

返回:描述错误信息的首地址

④ 执行一条sql语句
int sqlite3_exec(
  sqlite3 *db,                                   /* An open database */
  const char *sql,                               /* SQL to be evaluated */
  int (*callback)(void *arg,int,char**,char**),  /* Callback function */
  void *arg,                                     /* 1st argument to callback */
  char **errmsg                                  /* Error msg written here */
);

参数:db 操作数据库的指针句柄;

   sql 一条语句;

   callback 回调函数,只有sqi为查询语句的时候才会调用该回调函数;

   arg 给callback提供arg参数;

   errmsg 错误信息

返回:成功返回SQLITE_OK

⑤ sqlite3_exec回调函数的形式
int (*callback)(void *para, int f_num, char **f_value, char **f_name);

功能:每找到一条记录自动执行一次回调函数

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

   f_num 记录中包含的字段数目,也就是“列”数;

   f_value 每个字段值的指针数组;

   f_name 每个字段名称的指针数组

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

⑥ 查询数据库
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 */
);

参数:db 操作数据库的指针句柄;

   zSql SQL语句;

   pazResult 用来指向sql执行结果的指针;

   pnRow 满足条件的记录的数目,也就是“行”数;

   pnColumn 每条记录包含的字段数目,也就是“列”数;

   pzErrmsg 错误信息指向的地址

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

举个例子,有个数据库内容如下:

Name     | Age
--------------
Alice    | 43
Bob      | 28
Cindy    | 21

则azResult内容为:

azResult[0] = "Name";
azResult[1] = "Age";
azResult[2] = "Alice";
azResult[3] = "43";
azResult[4] = "Bob";
azResult[5] = "28";
azResult[6] = "Cindy";
azResult[7] = "21";

5、C语言使用示例

注意:编译时需要加上“-lsqlite3”链接参数。

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

#define DATABASE "stu.db"

int do_insert(sqlite3 *db)
{
	int id;
	char name[12] = {};
	int score;
	char sql[128] = {};
	char *errmsg;

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

	printf("Input name:");
	scanf("%s", name);
	getchar();

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

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

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


	return 0;
}

int do_delete(sqlite3 *db)
{
	int id;
	char sql[128] = {};
	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)
{
	int id;
	int score;
	char sql[128] = {};
	char *errmsg;

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

	printf("Update 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;
}

#if 0  /* 方法1:sqlite3_exec加回调函数方式 */

int callback(void *para, int f_num, char **f_value, char **f_name)
{
    int i = 0;
    
    /* 打印一行,因为每查找到一条记录都会调用一次回调函数 */
    for(i = 0; i < f_num; i++)
    {
        printf("%-11s ", f_value[i]);
    }
    printf("\n");
    
    return 0;
}

int do_query(sqlite3 *db)
{
    char sql[128] = {};
	char *errmsg;
    
    sprintf(sql, "select * from stu;");
    
	if(sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK){
		printf("%s\n", errmsg);
	} else {
		printf("Query done.\n");
	}
	return 0;
}

#else  /* 方法2:sqlite3_get_table函数方式 */

int do_query(sqlite3 *db)
{
	char sql[128] = {};
	char *errmsg;
	char **resultp;
	int nrow;
	int ncloumn;
	int i, j;
	int index;	

	sprintf(sql, "select * from stu;");

	if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncloumn, &errmsg) != SQLITE_OK){
		printf("%s\n", errmsg);
	} else {
		printf("Query done.\n");
	}
    
    /* 打印抬头 */
    for(j = 0; j < ncloumn; j++)
    {
        printf("%-11s ", resultp[j]);
    }
    printf("\n");

	index = ncloumn;
	for(i = 0; i < nrow; i++)
	{
		for(j = 0; j < ncloumn; j++)
        {
			printf("%-11s ", resultp[index++]);
		}
		printf("\n");
	}
	return 0;
}

#endif


int main(int argc, char **argv)
{
	sqlite3 *db;
	char *errmsg;
	int cmd;


	if(sqlite3_open(DATABASE, &db) != SQLITE_OK){
		printf("%s\n", sqlite3_errmsg(db));
		return -1;
	} else {
		printf("Open DATABASE success.\n");
	}

	if(sqlite3_exec(db, "create table stu(id Integer, name char, score Integer);", NULL, NULL, &errmsg) != SQLITE_OK){
		printf("%s\n", errmsg);
	} else {
		printf("create table success.\n");
	}

	while(1)
	{
		printf("*********************************************\n");
		printf("1:insert  2:delete  3:query  4:update  5:quit\n");
		printf("*********************************************\n");

		printf("please input your cmd:");
		scanf("%d", &cmd);
		getchar();

		switch(cmd)
		{
			case 1:
				do_insert(db);
				break;
			case 2:
				do_delete(db);
				break;
			case 3:
				do_query(db);
				break;
			case 4:
				do_update(db);
				break;
			case 5:
				sqlite3_close(db);
				exit(0);
			default:
				printf("Error Cmd\n");
				break;
		}	
	}
	return 0;
}
参考:

   【嵌入式】SQlite3数据库开发–华清远见成都中心.哔哩哔哩

   SQLite 教程.菜鸟教程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R-QWERT

你的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值