当前位置: 首页 > news >正文

SQlite数据库

介绍

基本信息:是一款轻量级的嵌入式关系型数据库管理系统。
主要特点:SQLite的源码是C语言,其源代码完全开发,SQLite第一个Alpha版本诞生于2000年5月,他是一个轻量级的嵌入式数据库。零配置,无需安装和配置服务器;单文件存储,数据库以单个文件形式存在;支持多种平台;支持事务,具备 ACID 特性;自包含,不依赖外部库;轻量级,代码量小,内存占用低。
应用场景:广泛应用于移动应用开发(如 iOS 和 Android 系统)、嵌入式设备、桌面应用的本地数据存储以及小型 Web 应用等场景。

安装数据库

在线安装

sudo apt-get install sqlite3

本地安装

官网下载sqlite3,然后本地安装:sudo dpkg -i *.deb

SQlite3 基本命令

1.系统命令

.help

显示所有系统命令的帮助信息。

.quit 或 .exit

退出 SQLite 命令行。

.schema [表名]

查看表结构(显示 CREATE TABLE 语句),省略表名则显示所有表的结构。

.databases

显示当前打开的所有数据库及其文件路径。

.tables [模式]

列出所有表名(可使用通配符,如 .tables user*)。

.headers on/off

显示 / 隐藏查询结果的列名(表头)。

.mode 模式

设置输出格式,常用模式:csvcolumninsertlinelist

.output 文件名

将输出重定向到文件(.output stdout 恢复到屏幕)。

.read 文件名

执行 SQL 文件中的命令。

.dump [表名]

导出数据库(或指定表)为 SQL 脚本(用于备份)。

.timer on/off

显示 / 隐藏查询执行时间统计。

2.sql命令

创建一张数据库的表 stu
create table stu(id Integer,name char,score Integer);
插入一张记录
insert into stu values(1001,'zhangsan',80);
插入部分字段记录
insert into stu(name,score) values(1002,'lisi');
查询所有记录
select *from stu;
查询数据库部分内容字段
select name,score from stu;
根据属性查询
select * from stu where score=80;
select *from stu where score=80 and name='zhangsan';
删除一条记录
delede from stu where id=1003;
delete from stu where socre='90';
更新一条记录
update stu set name='wangwu' where id=1001;
update stu set name='wangwu',score=88 where id = 1001;
添加一列
alter table stu add column address char;
删除一列:
1. 创建一张表
  提取字段
create table stu1 as select id,name,score from stu;

2.删除原有表

drop table stu;

3.将新的表的名字改成原有的表名字

alter table stu1 rename to stu;

SQlite相关API操作

1.打开sqlite数据库

int sqlite3_open(char *filename,sqlite3 **db)/*参数:
filename:数据库文件路径
db:指向sqlite句柄的指针
返回值:
成功返回0,失败返回错误码(非0值)*/

2.关闭sqlite数据库

int sqlite3_close(sqlite3 *db);/*参数:
db 操作数据库的指针
返回值:
成功返回0,失败返回错误码*/

3.通过db句柄得到数据库操作的错误信息

const char *sqlite3_errmsg(sqlite3 *db);/*参数:
db 操作数据库的指针
返回值:
返回错误信息的首地址*/

4.执行一条sql语句

int sqlite3_exec(
sqlite3*db,
const char *sql,
int (*callback)(void *,int,char**,char *8)
void *,
char **errmsg);/*参数
db:数据库操作句柄
sql:一条sql语句
callback:回调函数,只有sql为查询语句的时候,才会执行此语句
void * :给回调函数传递参数
errmsg:错误信息
返回值:
成功:SQLITE_OK*///回调函数原型
typedef int (*sqlite3_callback)(void *data,         // 由 sqlite3_exec() 的第4个参数传递的数据int argc,           // 结果集中的列数char **argv,        // 指向结果数据的指针数组(字符串)char **azColName    // 指向列名的指针数组
);/*返回值
返回 0 表示继续处理后续行。
返回非零值会中断查询并使 sqlite3_exec() 返回 SQLITE_ABORT*/

5.不使用回调函数执行SQL语句


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

用API实现对数据库的增删改查:

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>#define DATABASE "student.db"
int do_insert(sqlite3 *db)
{int id;int score;char name[32]={};char sql[128] = {};char *errmsg;printf("please input id:\n");scanf("%d",&id);getchar();printf("please input name:\n");scanf("%s",name);getchar();printf("please input score:\n");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);exit(1);}else{printf("insert success!\n");}return 0;
}int do_delete(sqlite3 *db)
{int id;char sql[128] = {0};char *errmsg;printf("please 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);exit(1);}else{printf("delete success!\n");}return 0;
}
int do_update(sqlite3 *db)
{int id;char sql[128] = {};int score;char *errmsg;printf("please input id:");scanf("%d",&id);getchar();printf("please 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);exit(1);}else{printf("update success!\n");}
}
int callback(void *para,int f_num,char **f_value,char **f_name)
{int i = 0;for(i=0;i<f_num;i++){printf("%s",f_value[i]);}putchar(10);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);exit(1);}else{printf("query success!\n");}return 0;}
int do_query2(sqlite3 *db)
{char sql[128] = {};char *errmsg;char **resultp;int nrow;int ncloumn;int i,j,index;sprintf(sql,"select * from stu");if(sqlite3_get_table(db,sql,&resultp,&nrow,&ncloumn,&errmsg) != SQLITE_OK){printf("%s",errmsg);}else{printf("query success!\n");}index = ncloumn;for(j=0;j<ncloumn;j++){printf("%-11s",resultp[j]);}putchar(10);for(i=0;i<nrow;i++){for(j=0;j<ncloumn;j++){printf("%-11s",resultp[index++]);}putchar(10);}return 0;
}
int main()
{sqlite3 *db;int cmd;char *errmsg;if(sqlite3_open(DATABASE,&db) != SQLITE_OK){printf("%s\n" ,sqlite3_errmsg(db));exit(1);}else{printf("open sqlite success!\n");}if( sqlite3_exec(db,"create table stu(id Integer,name char,score Integer)",NULL,NULL,&errmsg) != SQLITE_OK){printf("%s\n",sqlite3_errmsg(db));exit(1);}else{printf("create or open table success!\n");}while(1){printf("********************\n");printf("1:insert,2:delete3:quert,4:update,5:quit\n");printf("********************\n");printf("please input cmd!\n");scanf("%d",&cmd);getchar();//识别指令进行对应处理(增删改查)switch(cmd){case 1:do_insert(db);break;case 2:do_delete(db);break;case 3:do_query2(db);break;case 4:do_update(db);break;case 5:sqlite3_close(db);exit(1);break;default:printf("err cmd\n");}}return 0;
}

实现结果:

对数据库表stu进行增删改查:

用系统指令查看数据库表stu进行验证:

http://www.xdnf.cn/news/392635.html

相关文章:

  • 优化理赔数据同步机制:从4小时延迟降至15分钟
  • Day22 Kaggle泰坦尼克号训练实战
  • java加强 -List集合
  • LeetCode百题刷003(449周赛一二题)
  • 文件包含3
  • Qt 信号与槽及元对象系统
  • 判断两台设备是否在同一局域网内的具体方法
  • Unity 红点系统
  • Rockchip RK3308 开发(二)
  • 【人工智能】全面掌控:使用Python进行深度学习模型监控与调优
  • Springboot整合Swagger3
  • HttpServletResponse的理解
  • 【音视频工具】ffplay介绍
  • Redis 分布式锁
  • iOS实名认证模块的具体实现过程(swift)
  • 串口通讯
  • Docker使用ClickHouse | ClickHouse 配置用户名密码 | ClickHouse 可视化 | windows系统 | 镜像
  • [强化学习的数学原理—赵世钰老师]学习笔记01-基本概念
  • lampiao靶场渗透
  • # KVstorageBaseRaft-cpp 项目 RPC 模块源码学习
  • TikTok 账号运营干货:AI 驱动优化
  • Python----神经网络(基于Alex Net的花卉分类项目)
  • 按钮样式统一
  • Kids A-Z安卓版:儿童英语启蒙的优质选择
  • 特励达力科LeCroy推出Xena Freya Z800 800GE高性能的800G以太网测试平台
  • LLM 论文精读(四)LLM Post-Training: A Deep Dive into Reasoning Large Language Models
  • 基于多层权重博弈与广播机制的仿生类脑 AI 决策框架
  • 组合模式(Composite Pattern)详解
  • FR2012A富芮坤ADC:频繁调用adc_get_data要延时
  • 使用lldb看看Rust的HashMap