李优秀 发表于 2024-8-14 16:05:47

基于嵌入式Linux的数据库

数据库

数据库是在数据库管理系统和控制之下,存放在存储 介质上的数据集合。
基于嵌入式的数据库

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

SQLite的源码是C语言,其源代码完全开辟,SQLite
第一个Alpha版本诞生于2000年5月,他是一个轻量 级的嵌入式数据库。
SQLite有以下特性 零配置,无需安装和管理配置 存储在单一磁盘文件中的一个完备的数据库 数据库文件可以在不同字节序次的机器间自由共享支持数据库大小至2TB
充足小,全部源码大抵三万行C代码,250KB
比目前留下的大多数数据库对数据的利用更快
创建数据库

1.在线安装

sudo apt-get install sqlite3
2.本地安装

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

1.系统命令 以 . 开头的命令
        .help 帮助
        .quit 退出
        .schema查看表结构
        .databases 查看打开的数据库
        .table 
https://i-blog.csdnimg.cn/direct/edb70010bf4d4a979e0932a8167477e1.png
2.sql命令
基本的sql命令,不以 . 开头,但是都要 ; 末了
创建一张数据库的表
        stucreate table stu(id Integer,name char,score Integer);
https://i-blog.csdnimg.cn/direct/658348e1329e4dffab9b2a6940ce9153.png
插入一张记录
        insert into stu values(1001,'zhangsan',80);
https://i-blog.csdnimg.cn/direct/08e4c84a2742442891aae16a33b43ce9.png
插入部分字段记录
        insert into stu(name,score) values(1002,'lisi');
https://i-blog.csdnimg.cn/direct/82635725c2f243088e29491d743566ae.png
查询所有记录
        select *from stu
查询数据库部分内容字段
        select name,score from stu
https://i-blog.csdnimg.cn/direct/949f214d563f432699ecba767eebdcb0.png
根据属性查询
        select * from stu where score=80; select *from stu where score=80 and name='zhangsan';
https://i-blog.csdnimg.cn/direct/36211c25e9a540e8b9c5708f3cb21e6c.png
删除一条记录
        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;
https://i-blog.csdnimg.cn/direct/e6af1d0d4d124cdb9cdf2feda6953cfb.png
https://i-blog.csdnimg.cn/direct/7fae3ae99bc341d791dd8404ae417b4a.png
SQlite编程接口

4.API利用

1.int sqlite3_open(char *filename,sqlite3 **db)
        功能:打开sqlite数据库 参数:
        filename:数据库文件路径
        db:指向sqlite句柄的指针
返回值:
        成功返回0,失败返回错误码(非0值)
2.int sqlite3_close(sqlite3 *db);
        功能:关闭sqlite数据库 参数:
        db 利用数据库的指针
返回值:
               成功返回0,失败返回错误码
3.const char *sqlite3_errmsg(sqlite3 *db);
        功能:通过DB句柄得到数据库利用的错误信息
参数:
        db 利用数据库的指针       
        返回值: 返回错误信息的首地址
4.int sqlite3_exec(const char *sql, int (*callback)(void *,int,char**,char *8) void *, char **errmsg);
        功能:执行一条sql语句
参数
        db:数据库利用句柄
        sql:一条sql语句
        sqlite3*db,
        callback:回调函数,只有sql为查询语句的时间, 才会执行此语句
        void * :给回调函数转达参数
        errmsg:错误信息
返回值:
        成功:SQLITE_OK
int (*callback)(void *,int,char**,char *8)
        功能:查询效果,是一个函数指针类型,转达一个函数名
https://i-blog.csdnimg.cn/direct/fca3f03b76624dbb9fe30378c32df7f0.png
https://i-blog.csdnimg.cn/direct/f369ca8fa6c94bf586e777f37b317c16.png
https://i-blog.csdnimg.cn/direct/fbd7fdc16f06452a8b85eaf2a10848c9.png
回调函数接口:
typedef int(*sqlite3_callback)( void *para, int f_num, char ** f_value, char ** f_name)
        功能: 每找到一条记录自动执行一次回调函数
        para:转达给回调函数的参数
        f_num:记录中包含的字段数目
        f_value:包含每个字段值的指针数组
        f_name:包含每个字段名称的指针数组
返回值,
        成功返回0,失败返回-1
不使用回调函数执行SQL语句
int sqlite3_get_table( sqlite3 *db, const char *sql, char ***resultp,int *nrow, int *ncolumu,char **errmsg)
        功能:执行sql利用
        db:数据库句柄
        sql:sql语句
        resultp:用来指向sql执行效果的指针
        nrow:满意条件的记录的数目
        ncolumn:每条记录包含的字段数目
        errmsg:错误信息指针的地址
返回值:
        成功返回0,失败返回错误码
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

// sqlite3_callback 类型的回调函数
int callback(void *NotUsed, int argc, char **argv, char **azColName){
    int i;
    for(i = 0; i<argc; i++){
      printf("%s = %s\n", azColName, argv ? argv : "NULL");
    }
    printf("\n");
    return 0;
}

int main() {
    sqlite3 *db;
    char *err_msg = 0;
    int rc;
    char **result;
    int row, column;

    // 打开数据库
    rc = sqlite3_open("test.db", &db);
    if (rc) {
      fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
      return 1;
    }

    // 使用 sqlite3_exec 和回调函数
    rc = sqlite3_exec(db, "SELECT * FROM my_table", callback, 0, &err_msg);
    if (rc != SQLITE_OK ){
      fprintf(stderr, "SQL错误: %s\n", err_msg);
      sqlite3_free(err_msg);
      sqlite3_close(db);
      return 1;
    }

    // 使用 sqlite3_get_table 获取结果
    rc = sqlite3_get_table(db, "SELECT * FROM my_table", &result, &row, &column, &err_msg);
    if (rc != SQLITE_OK) {
      fprintf(stderr, "SQL错误: %s\n", err_msg);
      sqlite3_free(err_msg);
      sqlite3_close(db);
      return 1;
    }

    // 输出 sqlite3_get_table 的结果
    printf("sqlite3_get_table 结果:\n");
    for (int i = 0; i < row + 1; i++) {
      for (int j = 0; j < column; j++) {
            printf("%s ", result ? result : "NULL");
      }
      printf("\n");
    }

    // 释放结果
    sqlite3_free_table(result);

    // 关闭数据库
    sqlite3_close(db);

    return 0;
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 基于嵌入式Linux的数据库