【嵌入式Linux】SQLite数据库

SQLite简介(面试)

轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据库用于管理多段设备,更加复杂

SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,,这意味着数据库引擎作为应用程序的一部分运行。
MySQL需要运行服务区,MySQL将需要客户端和服务器架构通过网络进行交互

SQLite的优点SQLite的缺点
基于文件,易于设置和使用
适合基础开发和测试
轻松携带
使用标准SQL语法进行微小更改
使用方便
缺乏用户管理和安全功能
不容易扩展
不适合大数据库
无法定制
MySQL的优点MySQL的缺点
使用方便
提供了许多数据库相关功能
良好的安全功能
易于扩展,适用大型数据库
提供良好的速度和性能
提供良好的用户管理和多种访问机制
需要一些专业技术来设置
与传统SQL相比,语法略有不同

基于嵌入式的数据库主要有:SQLite,Firebird,Berkeley DB,eXtremDB

Firebird是关系型数据库,功能强大,支持存储过程,SQL兼容等
SQLite是关系型数据库,体积小,支持ACID事务
Berkeley DB并没有数据库服务的概念,他的程序直接连接到应用程序中
eXtremDB是内存数据库,运行效率高


SQLite数据库安装

安装方式一:

sudo apt-get install sqlite

安装方式二:

https://www.sqlite.org/download.html

在这里插入图片描述

1. 把下载的文件sqlite-autoconf-3390000.tar.gz		上传到开发板
2. tar vxf sqlite-autoconf-3390100.tar.gz 	解压
3. cd sqlite-autoconf-3390000 	进入文件夹
4. ./configure prefix=/usr/local 	配置安装路径在/usr/local
5. make 		//编译,比较久10分钟
6. sudo make install 		//安装

如上图,安装成功,运行sqlite3 进入SQL命令操作流程


SQLite命令用法

创建一个数据库

方式1:

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

方式2:

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

创建一张表格

create table stu(id Integer,name char,score Integer);

插入一条记录

insert into stu values(001,'huang',99);
insert into stu values(002,'gang',100);		''和""都行
insert into stu(name,score) values("huanggang",98);		插入部分字段内容

查看数据库的记录

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

删除一条记录

delete from stu where id = 001;

更新一条记录

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

删除一张表

drop table stu;

增加一列

alter table stu add column sex char;


SQLite的编程操作

打开/创建数据库的C接口

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

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据连接对象
int sqlite3_close(sqlite3*);
该例程关闭之前调用 sqlite3_open()打开数据库连接。所有与连接相关的语句都应该在连接关闭之前完成。
如果查询还没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误信息。

const char *sqlite3_errcode(sqlite3*);
sqlite3_errcode()通常用来获取最近调用的API接口返回的错误代码。
#define SQLITE_OK           0   /* 成功 | Successful result */
/* 错误码开始 */
#define SQLITE_ERROR        1   /* SQL错误 或 丢失数据库 | SQL error or missing database */
#define SQLITE_INTERNAL     2   /* SQLite 内部逻辑错误 | Internal logic error in SQLite */
#define SQLITE_PERM         3   /* 拒绝访问 | Access permission denied */
#define SQLITE_ABORT        4   /* 回调函数请求取消操作 | Callback routine requested an abort */
#define SQLITE_BUSY         5   /* 数据库文件被锁定 | The database file is locked */
#define SQLITE_LOCKED       6   /* 数据库中的一个表被锁定 | A table in the database is locked */
#define SQLITE_NOMEM        7   /* 某次 malloc() 函数调用失败 | A malloc() failed */
#define SQLITE_READONLY     8   /* 尝试写入一个只读数据库 | Attempt to write a readonly database */
#define SQLITE_INTERRUPT    9   /* 操作被 sqlite3_interupt() 函数中断 | Operation terminated by sqlite3_interrupt() */
#define SQLITE_IOERR       10   /* 发生某些磁盘 I/O 错误 | Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT     11   /* 数据库磁盘映像不正确 | The database disk image is malformed */
#define SQLITE_NOTFOUND    12   /* sqlite3_file_control() 中出现未知操作数 | Unknown opcode in sqlite3_file_control() */
#define SQLITE_FULL        13   /* 因为数据库满导致插入失败 | Insertion failed because database is full */
#define SQLITE_CANTOPEN    14   /* 无法打开数据库文件 | Unable to open the database file */
#define SQLITE_PROTOCOL    15   /* 数据库锁定协议错误 | Database lock protocol error */
#define SQLITE_EMPTY       16   /* 数据库为空 | Database is empty */
#define SQLITE_SCHEMA      17   /* 数据结构发生改变 | The database schema changed */
#define SQLITE_TOOBIG      18   /* 字符串或二进制数据超过大小限制 | String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT  19   /* 由于约束违例而取消 | Abort due to constraint violation */
#define SQLITE_MISMATCH    20   /* 数据类型不匹配 | Data type mismatch */
#define SQLITE_MISUSE      21   /* 不正确的库使用 | Library used incorrectly */
#define SQLITE_NOLFS       22   /* 使用了操作系统不支持的功能 | Uses OS features not supported on host */
#define SQLITE_AUTH        23   /* 授权失败 | Authorization denied */
#define SQLITE_FORMAT      24   /* 附加数据库格式错误 | Auxiliary database format error */
#define SQLITE_RANGE       25   /* 传递给sqlite3_bind()的第二个参数超出范围 | 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB      26   /* 被打开的文件不是一个数据库文件 | File opened that is not a database file */
#define SQLITE_ROW         100  /* sqlite3_step() 已经产生一个行结果 | sqlite3_step() has another row ready */
#define SQLITE_DONE        101  /* sqlite3_step() 完成执行操作 | sqlite3_step() has finished executing */
/* 错误码结束 */

打开创建关闭错误示例代码

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

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

    if(argc < 2){
        printf("Usage: %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 %d\n",sqlite3_errmsg(db),ret);
        if(ret == 14){
            printf("permission deny\n");
        }
        return -1;
    }

    sqlite3_close(db);
    printf("done\n");

    return 0;
}

创建表的接口

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

int sqlite3_exec(
  sqlite3,                                   /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);

sqlite3_exec用于执行一条sql语句,参数如下:
参数1:打开数据库得到的指针;
参数2:一条sql语句,是一个以“\0”结尾的字符串;
参数3:用户提供的回调函数,如果不需要回调函数,可以填 NULL。比如做insert 操作,做delete操作,就没有必要使用回调。而当你做select 时,就要使用回调;
参数4:回调函数需要传递的参数,如果不需要,可以填 NULL;
参数5:错误信息
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:字段名字

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]);
    }
    printf("===============================\n");
    return 0;//必须返回0,这样数据库中由多少条数据,这个回调函数就会被调用多少次
}


int main(int argc, char **argv)
{
    sqlite3 *db;
    char *errorMes = NULL;
    int ret;

    if(argc < 2){
        printf("Usage: %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 %d\n",sqlite3_errmsg(db),ret);
        if(ret == 14){
            printf("permission deny\n");
        }
        return -1;
    }

//  int sqlite3_exec(sqlite3, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg);
    ret = sqlite3_exec(db, "create table class01(id Integer,name char,score Integer);",    \
            callback, "content of sql:", &errorMes);//errorMes may sigment error!
    if(ret != SQLITE_OK){
        printf("create tables error: %s\n",errorMes);
    }
    }

    ret = sqlite3_exec(db, "insert into class01 values(001,'huang',99);",    \
            callback, "content of sql:", &errorMes);//errorMes may sigment error!
    printf("insert: %d,%s\n",ret,errorMes);

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

    sqlite3_close(db);
    printf("done\n");

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT阳晨。

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值