linux 下的 sqlite数据库

SQLite 认识


SQLite简介


轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据库用于管理多端设备,更加复杂
SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作为
应用程序的一部分运行。


MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互

SQLite 和 Mysql  比较: 

//需要复制粘贴的朋友,给你们提供了文字版

SQLite的优点:
基于文件,易于设置和使用,适合基础开发和测试,轻松携带 ,使用标准SQL语法进行微小更改,使用方便

SQLite的缺点:
缺乏用户管理和安全功能,不容易扩展,不适合大数据库,无法定制


MySQL的优点:
使用方便,提供了许多与数据库相关的功能,良好的安全功能,易于扩展,适用于大型数据库,提供良好的速度和性能,提供良好的用户管理和多种访问控制

MySQL的缺点:
需要一些技术专业知识来设置与传统SQL相比,语法略有不同 (简记: 专业化要求比较高)

其他数据库


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


=========================================================


SQLite 数据库的安装:

方法一 : sudo apt-get -y install sqlite // -y 选项 跳过 -y 确认


方法二:  去window的官网下载: https://www.sqlite.org/download.html,再传到我们的Linux 系统

具体步骤: 
1. 把下载的文件sqlite-autoconf-3390000.tar.gz上传到开发板
2. tar xvf sqlite-autoconf-3390000.tar.gz 解压
3. cd sqlite-autoconf-3390000 进入文件夹
4. ./configure PREFIX=/usr/local 配置安装路径在/usr/local  // ./config --help  -- 配置常用选项,PREFIX --选择安装路径
5. make 编译//比较久10分钟
6. sudo make install 安装

cd认知回顾

~目录
~目录就是进入home目录下当前用户的目录,可以称为用户家目录
home目录(叫用户列表目录更形象)

cd home会显示这台机器的所有用户,任何用户进入都会显示

cd /:根目录
所有用户执行该命令都会进入同一个目录,即所有用户共享。


cd - :  回退到上一次你移动过来的目录

=========================================


.db 数据库类型文件


sqlite 常用快捷键 -- ctrl + z  用于在输入错误的时候退出


SQLite 命令用法:

创建一个数据库: 

func1: 


1. sqlite3 进入数据库
2. .open test.db
3. .quit
数据库退出后在命令当前路径创建数据库test.db


func2:

sqlite3 test.db //在命令运行当前窗口创建数据库test.db
在数据库命令下
.databases 列出当前打开的数据库
.quit 退出


创建一张表格


create table stu2(id Integer,name char,score Integer); //  注意顺序,里面的参数是 先写变量名,再写类型


插入一条记录


insert into stu values(18130106,'huang',99);
insert into stu2 values(18130101,"gang",100); //  和python一样: '' 和""都行, 都可以表示字符串
insert into stu(name,score) values("huanggang",98);    //插入部分(指定)字段内容  

查看数据库的记录:

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


删除一条记录:

delete from stu where id = 18130101;

更改一条记录

update stu set name = 'huangg' where id = 18130106;

删除一张表:

drop table stu;


增加一列

alter table stu add column sex char;

insert into stu2 values(003,'mxjun',88,'m');

insert into stu values(18130106,'huang',99);

-------------------------------------------

更多命令: 

请参看这篇博客: mysql根本-SQL-CSDN博客

虽然是 mysql 但里面的大多命令都是通用的

===========================================

SQL 编程  

--  打开,创建 数据库 及 错误显示


头文件:
<sqlite3.h>

API:


sqlite3_open(const char *filename, sqlite3 **ppDb);  //第一个参数就是要打开的数据库文件 .db 格式,该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。

sqlite3_close(sqlite3*)
该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。const char *sqlite3_errmsg(sqlite3*);

sqlite3_errcode() 通常用来获取最近调用的API接口返回的错误代码.

sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char**errmsg)

该例程提供了一个执行 SQL 命令的快捷方式,SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。
在这里,第一个参数 sqlite3 是打开的数据库对象,sqlite_callback 是一个回调,data 作为其第一个参数,errmsg 将被返回用来获取程序生成的任何错误(调试的时候很好用)
sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。

int callback(void *arg, int column_size, char *column_value[], char*column_name[])

参数分析:

void *arg:是sqlite3_exec函数的第四个参数

column_size:数据库的字段数
column_value[]:列的值

column_name:字段名字

回调函数  必须 return 0  ,这种情况下打印的次数 就是插入数据条数 (= 回调函数被调用次数)
//  注意 if 不 return 0 回调函数 的 只会被调用一次,导致数据的输出不完整 

错误码:

编译链接:  -lsqlite3
 -l的作用就是用来指定具体的静态库

-l说明

-l  (小写的l)参数和-L  (大写的l)参数
-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?
就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。

好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。

放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它放在/usr/X11R6/lib目录下,我们编译时就要用-L /usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltes


小tips : sudo chmod -r new.db   //  去除 new.db 的 读权限

实例:


======================================


case 1 : C 语言打开/创建 数据库:


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

int main(int argc ,char ** argv)
{

    sqlite3 *db;
    int ret;
    if(argc < 2){
        printf("uage %s xxx.db \n",argv[0]);
        return -1;
    }

//  第一个参数是要打开的数据文件,第二个就是前面的指向 SQLite 数据库文件的连接
    if((ret=sqlite3_open(argv[1],&db))== SQLITE_OK){
        printf("open %s success!\n",argv[1]);
    }
    else{
    printf("error %s \n",sqlite3_errmsg(db));
    if(ret == 14) {// 这里的错误码14 对应的是权限错误,可以点击目录错误码比对查看
    puts("permisson no suit");
    }
    return -1;
    }
    sqlite3_close(db); // 像文件操作一样,打开用完后要关闭
    puts("Done");

    return 0;
}

===============================================================

case 2 : C语言编程 创建表


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

int callback(void *arg, int column_size, char *column_value[], char*column_name[])
{ // 四个参数都用到了
    int i;
    printf("arg = %s\n",(char *)arg);
    for(i=0;i<column_size;++i) {
        printf("%s = %s\n",column_name[i],column_value[i] );

    }
    puts("========================================");

    return 0;
}


int main(int argc ,char ** argv)
{

    sqlite3 *db;
    int ret;
    char *errorMsg;
    if(argc < 2){
        printf("uage %s xxx.db \n",argv[0]);
        return -1;
    }
    if((ret=sqlite3_open(argv[1],&db))== SQLITE_OK){
        printf("open %s success!\n",argv[1]);
    }
    else{
        printf("error %s \n",sqlite3_errmsg(db));
        if(ret == 14) {
            puts("permisson no suit");
        }
        return -1;
    }

    //sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char**errmsg)
    sqlite3_exec(db,"select *from stu2;",callback,"content of sqlite",&errorMsg);//这个API负责执行 sqlite 的命令


    sqlite3_close(db);
    puts("Done");

    return 0;
}

这里我们有两条数据,我们return0 就打印两次,if return 1, 或者其他值,只会打印第一份数据


===================================


case3: 编程实现建表 和 插入数据


tips: C语音代码过长分行处理  加 \ 回车


// 注意:  sqlite_exec( )的第四个参数用来调试非常有用 --  会打印 错详细信息 -- 比如缺少参数,参数过多等


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

int callback(void *arg, int column_size, char *column_value[], char*column_name[])
{
    int i;
    printf("arg = %s\n",(char *)arg);
    for(i=0;i<column_size;++i) {
        printf("%s = %s\n",column_name[i],column_value[i] );

    }
    puts("========================================");

    return 0;
}


int main(int argc ,char ** argv)
{

    sqlite3 *db;
    int ret;
    char *errorMsg;
    if(argc < 2){
        printf("uage %s xxx.db \n",argv[0]);
        return -1;
    }
    if((ret=sqlite3_open(argv[1],&db))== SQLITE_OK){
        printf("open %s success!\n",argv[1]);
    }
    else{
        printf("error %s \n",sqlite3_errmsg(db));
        if(ret == 14) {
            puts("permisson no suit");
        }
        return -1;
    }

    //sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char**errmsg)

 // 建表
    ret=sqlite3_exec(db,"create table class1(id Integer,name char,score Integer);",\
            callback,"content of sqlite",&errorMsg);//errorMsg may be sigment error;
   
    if(ret != SQLITE_OK){
    printf("create tables error:%s\n",errorMsg); //出错就把错误信息打印出来
    }

 //插入数据
    ret=sqlite3_exec(db,"insert into class1 values(6,'xiaomei',66);",\
            callback,"content of sqlite",&errorMsg);//errorMsg may be sigment error;

//显示数据
    ret=sqlite3_exec(db,"select * from class1;",\
            callback,"content of sqlite",&errorMsg);//errorMsg may be sigment error;

    sqlite3_close(db);
    puts("Done");

    return 0;
}


 

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

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

相关文章

【语音识别】在Win11使用Docker部署FunASR服务器

文章目录 在 Win11 使用 Docker 部署 FunASR 服务器镜像启动服务端启动监控服务端日志下载测试案例使用测试案例打开基于 HTML 的案例连接ASR服务端 关闭FunASR服务 在 Win11 使用 Docker 部署 FunASR 服务器 该文章因官网文档不详细故写的经验论 官网文章&#xff1a;https:/…

Docker - WEB应用实例

原文地址&#xff0c;使用效果更佳&#xff01; Docker - WEB应用实例 | CoderMast编程桅杆Docker - WEB应用实例 在之前的章节中&#xff0c;仅对普通容器进行了演示&#xff0c;但在实际中常常使用到 Docker 容器中的 WEB 应用程序。 运行一个WEB应用 拉取镜像 创建一个容器…

NewStarCTF 2023 web

目录 week1 泄漏的秘密 Begin of Upload Begin of HTTP ErrorFlask Begin of PHP R!C!E! EasyLogin week2 游戏高手 include 0。0 ez_sql Unserialize&#xff1f; Upload again! R!!C!!E!! week3 Include &#x1f350; medium_sql POP Gadget GenShin wee…

unity学习(89)——unity塞满c盘!--删除editor下的log文件

卸了一个视频后强制续命打开详细信息&#xff1a; 这个再往下找也是没用的&#xff01; 显示隐藏文件夹后&#xff01;执行如下操作&#xff01; 30个g&#xff01; 其中unity占23g editer占了21g 删除C:\Users\王栋林\AppData\Local\Unity\Editor下的log文件 恢复到之前的水…

【编译原理】03语法分析

1&#xff0c;语法分析的若干问题 1.1 语法分析器的作用 编译器前端的重要组成部分&#xff1a; (1) 根据词法分析器提供的记号流&#xff0c;为语法正确的输入构造分析树(或语法树)。 (2) 检查输入中的语法(可能包括词法)错误&#xff0c;并调用出错处理器进…

031——从GUI->Client->Server->driver实现dht11数据的采集

目录 0、设置ip 1、修改显示界面 2、 修改客户端 3、 修改服务器程序通信部分 4、 修改驱动处理程序 5、 重写驱动程序 6、 展示 0、设置ip 因为ifconfig命令要被淘汰了&#xff0c;所以我们改成使用ip命令设置ubuntu的ip ip addr add 192.168.5.10/24 dev ens36 ip …

ElasticSearch中使用向量和关键词联合检索

注&#xff1a;案例测试数据及其索引构建详见&#xff1a;ElasticSearch中使用bge-large-zh-v1.5进行向量检索&#xff08;一&#xff09;-CSDN博客 中的第三部分。 假设任务场景为&#xff1a;用“新疆”向量检索相关的数据&#xff0c;同时需要匹配关键词“巴州”。 首先获取…

VUE运行找不到pinia模块

当我们的VUE运行时报错Module not found: Error: Cant resolve pinia in时 当我们出现这个错误时 可能是 没有pinia模块 此时我们之要下载一下这个模块就可以了 npm install pinia

Elasticsearch进阶篇(三):ik分词器的使用与项目应用

ik分词器的使用 一、下载并安装1.1 已有作者编译后的包文件1.2 只有源代码的版本1.3 安装ik分词插件 二、ik分词器的模式2.1 ik_smart演示2.2 ik_max_word演示2.3 standard演示 三、ik分词器在项目中的使用四、ik配置文件4.1 配置文件的说明4.2 自定义词库 五、参考链接 一、下…

利用Opencv4.9为图像添加边框

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇利用OpenCV4.9制作自己的线性滤波器&#xff01; 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 …

[Spring Cloud] (4)搭建Vue2与网关、微服务通信并配置跨域

文章目录 前言gatway网关跨域配置取消微服务跨域配置 创建vue2项目准备一个原始vue2项目安装vue-router创建路由vue.config.js配置修改App.vue修改 添加接口访问安装axios创建request.js创建index.js创建InfoApi.js main.jssecurityUtils.js 前端登录界面登录消息提示框 最终效…

故障诊断 | 用于跨机器工况下故障诊断的深度判别迁移学习网络附Pytorch代码

目录 基础代码小结基础 目前,研究者已经提出了很多用于解决目标域和源域之间的分布对齐和知识迁移问题的领域自适应方法。然而,大多数研究方法只关注到边缘分布对齐,忽略了目标域和源域之间判别性特征的学习。因此,在某些案例中,这些方法仍然不能很好地满足故障诊断要求。…

InFusion:通过从扩散先验学习深度完成来修复3D高斯

InFusion: Inpainting 3D Gaussians via Learning Depth Completion from Diffusion Prior InFusion&#xff1a;通过从扩散先验学习深度完成来修复3D高斯 Zhiheng Liu * 刘志恒 *1144Hao Ouyang * 欧阳浩 *2233Qiuyu Wang 王秋雨33Ka Leong Cheng 郑家亮2233Jie Xiao 街小…

Elasticsearch常用查询语法及RestClient操作

DSL Query基本语法 1&#xff0c;查询所有数据matchall&#xff08;当然并不是会显示所有数据&#xff09; #查询所有数据 GET /索引名/_search {"query": {"查询类型": {"查询条件":"条件值"}} }2&#xff0c;全文搜索检索-分词搜索…

从零实现诗词GPT大模型:实现Transformer架构

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 首先说明一下,跟其他文章不太一样,在本篇文章中不会对Transformer架构中的自注意力机制进行讲解,而是后面单独1~2篇文章详细讲解自注意力机制,我认为由浅入深的先了解Transformer整体架构和其中比较简单…

IDEA JAVA项目如何设置JVM参数

问题背景&#xff1a; 有时候项目在本地启动时会报参数引用不到&#xff0c;如果确实找不到在哪里添加的话&#xff0c;我们可以先加JVM参数来暂时解决本地环境的调试。 解决方案&#xff1a; 编辑配置Edit Configurations 选择需要配置的项目&#xff0c;点击Modify options 选…

React基础知识大汇总

函数组件和类组件 函数组件与类组件有什么区别呢&#xff1f; function getName(params:{name:string}){const count 0;return params.name -count; } getName({name:"test"}) getName({name:"哈哈哈"})getName是一个纯函数&#xff0c;不产生任何副作用…

mfc140.dll丢失如何修复,分享多种有效的修复方法

在日常操作和使用电脑的过程中&#xff0c;我们可能会遇到一种较为常见的问题&#xff0c;即在尝试启动或运行某个应用程序时&#xff0c;系统突然弹出一个错误提示窗口&#xff0c;明确指出“mfc140.dll文件丢失”。这个mfc140.dll实际上是一个动态链接库文件&#xff08;DLL&…

mysql基础19——日志

日志 mysql的日志种类非常多 通用查询日志 慢查询日志 错误日志 与时间有关联 二进制日志 中继日志 与主从服务器的同步有关 重做日志 回滚日志 与数据丢失有关 通用查询日志 记录了所有用户的连接开始时间和截至时间 以及给mysql服务器发送的所有指令 当数据异常时&…

计算机体系结构

体系结构 CPU&#xff1a;运算器和控制器 运算器&#xff1a;进行算术和逻辑运算控制器&#xff1a; 输入设备&#xff1a;鼠标、键盘、显示器、磁盘、网卡等输出设备&#xff1a;显卡&#xff0c;磁盘、网卡、打印机等存储器&#xff1a;内存&#xff0c;掉电易失总线&#xf…