【SQLite数据库】的使用

news2024/11/18 12:17:38

SQLite数据库

文章目录

  • SQLite数据库
    • 0、linux基础知识补充
    • 1、SQLite简介
      • 1.1 SQLite & MySQL 的优缺点比较
      • 1.2 常见的嵌入式数据库
    • 2、数据库的基本命令和用法
      • 2.1 创建数据库
      • 2.2 创建一张表格
      • 2.3 插入一条数据
      • 2.4 增加一列
      • 2.5 删
      • 2.6 改
      • 2.7 查看数据库
    • 3、数据库编程
      • 3.1 实验1:打开/创建数据库C接口
      • 3.2 实验2:创建表的C接口
        • 3.2.1 callback()
        • 3.2.2 sqlite_open()
        • 3.2.3 sqlite_exec()
        • 3.2.4 实验2

0、linux基础知识补充

  • cd -:回到上一成执行目录

  • .configure:是配置的意思

  • >>>.table     -- 查看数据库中的表
    >>>.databases -- 列出当前打开的数据库
    >>>.databases -- 列出当前打开的数据库
    >>>.quit      -- 数据库退出
    

1、SQLite简介

  • 轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据 库用于管理多端设备,更加复杂
  • SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作为 应用程序的一部分运行。
  • MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互。

1.1 SQLite & MySQL 的优缺点比较

SQLite优点SQLite缺点MySQL优点MySQL缺点
1、基于文件,易于使用1、功能欠缺:用户管理、安全功能1、功能多1、复杂一点,需要技术专业知识来识别
2、与SQL类似,微小更改2、不易扩展,不适合大数据库、2、易于扩展适用于大模型2、与传统SQL语法略有不同
3、适合基础开发3、无法定制3、速度块

1.2 常见的嵌入式数据库

在这里插入图片描述

2、数据库的基本命令和用法

2.1 创建数据库

-- 打开方式一
sqlite3     	-- 进入数据库
>>>.open test.db    -- 打开数据库
>>>.quit
-- 数据库退出后在命令当前路径创建数据库test.db

-- 打开方式二
sqlite3 test.db -- 在命令运行当前窗口创建数据库test.db
-- 在数据库命令下
>>>.databases   -- 列出当前打开的数据库
>>>.quit        -- 退出
打开方式一
在这里插入图片描述
打开方式二
在这里插入图片描述

2.2 创建一张表格

create table stu2(id Integer,name char,score Integer); -- Integer整数

2.3 插入一条数据

insert into stu values(001,'tp',99);
insert into stu2 values(002,"s",100);       -- ''和""都行
insert into stu(name,score) values("张三",98); -- 插入部分字段内容

2.4 增加一列

alter table stu add column sex char; -- 增加了性别一栏

2.5 删

-- 删除一条数据
delete from stu where id = 002;
-- 删除一张表
drop table stu

2.6 改

update stu set name = 'tp' where id = 000;

2.7 查看数据库

select * from stu;          -- 查询所有字段的结果
select name,score from stu; -- 查询数据库中部分字段的内容

3、数据库编程

3.1 实验1:打开/创建数据库C接口

下面的 C 代码段显示了如何连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将 返回一个数据库对象。

//opensqlite.c
#include <stdio.h>
#include <sqlite3.h>
int main(char argc, char **argv)
{
    sqlite3 *db;
    int ret;
    if(argc < 2)
    {
        printf("Usage: %s xxx.db\n",argv[0]);
        return -1;
    }
    //sqlite3_open(const char *filename, sqlite3 **ppDb)
    //第一个参数filename:要打开或创建的数据库文件的名称。如果文件不存在,SQLite 将尝试创建一个新的数据库文件
    //用于存储指向打开的数据库连接的指针的指针
    if( (ret = sqlite3_open(argv[1],&db)) == SQLITE_OK)
    {
        printf("open %s success\n",argv[1]);
    }
    else
    {
        //const char *sqlite3_errmsg(sqlite3*);
        //sqlite3_errcode() 通常用来获取最近调用的API接口返回的错误代码.
        printf("error:%s,%d",sqlite3_errmsg(db),ret);
        if(ret = SQLITE_PERM)
        {
            printf("permission no\n");
        }
        return -1;
    }
    //sqlite3_close(sqlite3*)
    //该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。
    //如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。
    sqlite3_close(db);
    printf("done\n");
    return 0;
}
实验1 打开/创建数据库C接口 结果
在这里插入图片描述

3.2 实验2:创建表的C接口

  • 下面的 C 代码段将用于在先前创建的数据库中创建一个表:

  • 几个API

3.2.1 callback()
  • callback(void *arg, int column_size, char *column_value[], char *column_name[])
        //void *arg:是sqlite3_exec函数的第四个参数
        //colunm_size 表示数据库的数据库中的字段(Field),每个字段对应表中的一个列,一个表有几列就是几;
        //column_value[]:列的值
        //column_name:字段名字
    
3.2.2 sqlite_open()
  • sqlite3_open(const char *filename, sqlite3 **ppDb)
        //第一个参数filename:要打开或创建的数据库文件的名称。如果文件不存在,SQLite 将尝试创建一个新的数据库文件
        //用于存储指向打开的数据库连接的指针的指针
    
3.2.3 sqlite_exec()
  • sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char**errmsg)
            //第二个参数sql:要执行的 SQL 查询语句,可以包含单个或多个 SQL 语句,每条语句以分号结束。
            //第三个参数是一个回调函数callback,用于处理查询结果的每一行数据;
            //第四个参数data作为回调函数callback的第一个参数 void *arg; 
            //第五个参数errmsg将被返回用来获取程序生成的任何错误。
            //int callback(void *arg, int column_size, char *column_value[], char*column_name[])
        	//sqlite3_exec返回值为 0 时,表示操作成功完成
    
3.2.4 实验2
//creatSqlite.c
#include <stdio.h>
#include <sqlite3.h>
// int callback(void *arg, int column_size, char *column_value[], char*column_name[])

int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{
    printf("arg = %s\n",(char *)arg);
    //void *arg:是sqlite3_exec函数的第四个参数
    //colunm_size 表示数据库的数据库中的字段(Field),每个字段对应表中的一个列,一个表有几列就是几;
    //column_value[]:列的值
    //column_name:字段名字
    for(int i = 0; i<column_size; i++)
    {
        printf("%s = %s\n",column_name[i],column_value[i]);
    }
    printf("======================================\n");
    return 0;//必须返回0,这样数据库中有多少条数据,这个回调函数就会被调用多少次
}
int main(char argc, char **argv)
{
    sqlite3 *db;
    char *errorMes = NULL;
    int ret;
    if(argc < 2)
    {
        printf("Usage: %s xxx.db\n",argv[0]);
        return -1;
    }
    //sqlite3_open(const char *filename, sqlite3 **ppDb)
    //第一个参数filename:要打开或创建的数据库文件的名称。如果文件不存在,SQLite 将尝试创建一个新的数据库文件
    //用于存储指向打开的数据库连接的指针的指针
    if( (ret = sqlite3_open(argv[1],&db))==SQLITE_OK)
    {
        printf("open %s success\n",argv[1]);
    }
    else
    {
        //const char *sqlite3_errmsg(sqlite3*);
        //sqlite3_errcode() 通常用来获取最近调用的API接口返回的错误代码.
        printf("error:%s,%d",sqlite3_errmsg(db),ret);
        if(ret = SQLITE_PERM)
        {
            printf("permission no\n");
        }
        return -1;
    }

    // sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char**errmsg)
        //第二个参数sql:要执行的 SQL 查询语句,可以包含单个或多个 SQL 语句,每条语句以分号结束。
        //第三个参数是一个回调函数callback,用于处理查询结果的每一行数据;
        //第四个参数data作为回调函数callback的第一个参数 void *arg; 
        //第五个参数errmsg将被返回用来获取程序生成的任何错误。
        //int callback(void *arg, int column_size, char *column_value[], char*column_name[])
    	//sqlite3_exec返回值为 0 时,表示操作成功完成
    ret = sqlite3_exec(db,"create table Class03(id Integer,name char,score Integer);",\
            callback,"content of sql:",&errorMes); //errorMes may sigment error
    if(ret != SQLITE_OK)
    //SQLITE_OK 是 SQLite 中的一个宏定义,表示操作成功完成的返回代码。
    //在 SQLite 中,每个操作都会返回一个特定的返回代码,用于指示操作的结果。
    //SQLITE_OK 代表操作成功完成,没有发生错误。
    {
        printf("creat tables error:%s\n",errorMes);//如果已经创建,会有errorMes提示
    }

    printf("go ahead\n");
    ret = sqlite3_exec(db,"insert into Class03 values(002,'kkkk',99);",\
            callback,"content of sql:",&errorMes); //errorMes may sigment error
    printf("insert:%d,%s\n",ret,errorMes);//会有errorMes提示

    ret = sqlite3_exec(db,"select * from Class03;",\
            callback,"content of sql:",&errorMes); //errorMes may sigment error
    printf("select:%d,%s\n",ret,errorMes);//会有errorMes提示

    //sqlite3_close(sqlite3*)
    sqlite3_close(db);
    //该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。
    //如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。
    printf("done\n");
    return 0;
}
  • 相当于执行了
sqlite3 test2.db
>>>create table Class03(id Integer,name char,score Integer);
>>>insert into Class03 values(002,'kkkk',99);
>>>select * from Class03;

可以通过修改sqlite3_exec()函数中第二个参数,在sqlite3 里面运行不同数据库指令

  • 实验2结果

在这里插入图片描述



欢迎大家一起交流讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1521639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过actions configuration tool进行快速open 软件的定义

这个主要是看到有人可以直接在文件夹中右键打开terminator得到的启发&#xff1a; 首先需要下载工具 sudo apt-get install nautilus-actions下载terminator&#xff1a; sudo apt-get install terminator去软件目录寻找filemanager-action 然后新建一个action&#xff0c…

力扣59. 螺旋矩阵 II

思路&#xff1a;此题思路就是绕圈遍历&#xff0c;全靠条件处理技巧&#xff0c;重点要清楚的就是循环不变量&#xff1a;左闭右开&#xff08;即拐弯处的一个数&#xff0c;留给第二行处理&#xff09; 以下是代码随想录的作者的一张图片&#xff0c;每次for循环&#xff0c;…

【计算机组成原理】处理机管理

目录 一、处理机分类 1. MPU 2. MCU 3. DSP 二、CPU的功能 1. 指令控制 2. 操作控制 3. 时间控制 4. 数据加工 三、CPU的组成 &#xff08;一&#xff09;控制器 1. 控制器的功能 &#xff08;1&#xff09;控制指令执行的顺序 ① 程序中规定的转移类型指令 ② …

ctf_show笔记篇(web入门---代码审计)

301&#xff1a;多种方式进入 从index.php页面来看 只需要访问index.php时session[login]不为空就能访问 那么就在访问index.php的时候上传login 随机一个东西就能进去从checklogin页面来看sql注入没有任何过滤 直接联合绕过 密码随意 还有多种方式可以自己去看代码分析 30…

Linux/secret

Enumeration nmap 第一次扫描发现系统对外开放了22&#xff0c;80和3000端口&#xff0c;端口详细信息如下 可以看到22端口对应的是ssh服务&#xff0c;80和3000都是http服务&#xff0c;80端口使用nginx&#xff0c;3000使用了Node.js TCP/80 可以先从80端口开始探索&…

XXE漏洞原理和pikachu靶场实验

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、XXE漏洞原理 XXE全称&#xff1a;XML External Enti…

【C++庖丁解牛】List容器的介绍及使用 | 深度剖析 | list与vector的对比

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. list的介绍1.1 list的…

外贸灯具行业如何找到精准客户?

外贸灯具行业怎么找客户&#xff1f;分析自己的目标客户群 1:灯具的贸易商&#xff0c;中间商 2:灯具的品牌制造商(做贴牌的可以开发) 3:五金建材超市 4:日用品综合超市 5:小家电产品的批发商&#xff0c;代理商 6:礼品公司 7:照明工程承包商&#xff0c;比如:路灯&#xff0c…

HC32F4A0与HC32F460的io口灵活配置灵活映射功能

华大半导体的HC32F4A0和HC32F460系列单片机在IO口配置灵活性方面具有较高级别的可重映射能力。相较于STM32系列&#xff0c;具体差异如下&#xff1a; HC32F4A0/F460系列&#xff1a; 这两个系列的单片机似乎提供了更为灵活的IO口复用功能。开发笔记中提到&#xff0c;用户可以…

使用Loadrunner进行性能测试

一、确定性能测试的范围、要求、配置、工具等 明确测试的系统&#xff1a; 本文档主要指的是web应用。 明确测试要求&#xff1a; 用户提出性能测试&#xff0c;例如&#xff0c;网站首页页面响应时间在3S之内&#xff0c;主要的业务操作时间小于10s&#xff0c;支持300用户在…

HarmonyOS NEXT应用开发—折叠屏音乐播放器方案

介绍 本示例介绍使用ArkUI中的容器组件FolderStack在折叠屏设备中实现音乐播放器场景。 效果图预览 使用说明 播放器预加载了歌曲&#xff0c;支持播放、暂停、重新播放&#xff0c;在折叠屏上&#xff0c;支持横屏悬停态下的组件自适应动态变更。 实现思路 采用MVVM模式进…

架构设计的核心目的与意义

以史为鉴&#xff0c;对我们了解架构设计的目的很有帮助。谈到架构设计&#xff0c;相信每个技术人员都是耳熟能详&#xff0c;但如果深入探讨一下&#xff0c;“为何要做架构设计&#xff1f;”或者“架构设计目的是什么&#xff1f;”类似的问题&#xff0c;大部分人可能从来…

【ArcGISPro】道路数据下载并使用

下载 下载链接: Geofabrik 下载服务器 这些数据通常 每天更新。 下载结果 arcmap用户下载工具 10.2:http://www.arcgis.com/home/item.html?id=16970017f81349548d0a9eead0ebba39 10.3:

【扩散模型(一)】综述:扩散模型在文本生成领域应用

一、论文信息 1 标题 Diffusion models in text generation: a survey 2 作者 Qiuhua Yi, Xiangfan Chen, Chenwei Zhang, Zehai Zhou, Linan Zhu, Xiangjie Kong 3 研究机构 1 College of Computer Science and Technology, Zhejiang University of Technology, HangZho…

DVWA-File Upload文件上传

什么是文件上传漏洞&#xff1f; 黑客利用文件上传后服务器解析处理文件的漏洞上传一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。 造成文件上传漏洞的原因: 1.服务器配置不当 2.开源编辑器上传漏洞 3.本地文件上传限制被绕过 4.过滤不严格被…

攻防世界-misc-Make-similar

题目链接&#xff1a;攻防世界 (xctf.org.cn) 下载得到ogg文件。Olympic CTF 2014原题有提示120 LPM&#xff0c;对应Radiofax。需要将ogg格式文件转换成wav格式音频后&#xff0c;用OS X下的软件Multimode转换成单色传真图像&#xff1a; 文字部分为&#xff1a; section 1 of…

重学SpringBoot3-整合SSM

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-整合SSM Spring Boot整合SSM示例1. 创建Spring Boot项目2. 配置数据源3. 配置MyBatis4. 实现数据访问对象&#xff08;DAO&#xff09;5. 编写服务层和控…

【绿色碳中和】工作报告词频分析—绿色环保词频数据(2001-2024)

数据简介&#xff1a;随着经济的发展和工业产业的腾飞&#xff0c;人们更多的从关注经济发展走向可持续生态经济发展&#xff0c;我国也于2020年9月22日在第七十五届联合国大会上提出了碳达峰、碳中和的目标。随着碳市场的建立和逐步完善&#xff0c;越来越多的政策与绿色环保概…

Linux多进程中wait()函数学习

wait()函数是Linux/Unix系统里的一个系统级函数&#xff0c;在C语言中通过#include <sys/wait.h>包含该系统调用的头文件。 想要查看如何使用这个函数&#xff0c;可以在终端中输入&#xff1a; man 2 wait如下图&#xff1a; wait系统调用可以让父线程阻塞等待子线程的…

selenium + robotframework的运行原理

1、点击ride界面启动用例执行时&#xff0c;首先会调用脚本 2、打开pybot脚本查看内容、 3、打开robot包下面的run文件&#xff0c;我们可以看到信息 run文件内容 程序启动的入口&#xff0c; sys.agv所表达的含义是&#xff1a;sys.argv[]说白了就是一个从程序外部获取参数的桥…