sqllite学习

一、定义

        sqllite属于轻量级的嵌入式数据库,能支持的数据量为2TB,体积小,支持ACID事务

二、c编程

安装

sudo apt update

sudo apt install sqlite3

sudo apt install libsqlite3-dev

pkg-config --libs sqlite3

2.1 接口

官网

Prepared Statement Object

1. 打开数据库

        

int sqlite3_open(const char * filename, sqlite3 **ppDb);

        filename为数据库路径名, ppdb为数据库的操作指针

2. 关闭数据库

       

int sqlite3_close(sqlite3 *db);

   db为数据库的操作指针

成功返回 SQLITE_OK,出错返回错误码

3.执行sql语句

int sqlite_exec(
    sqlite3 *db, const char *sql, 
int (*callback)(void *, int, char **, char **),
void* arg, char**errmsg
);

        db为数据库操作句柄,sql为具体语句,callback为回调函数,只有sql为select时才会使用,arg为回调函数传参, errmsg为返回消息。

返回值:成功为SQLITE_OK

        在回调函数中有:

typedef int(*sqlite3_callback)
(void *para, int f_num, char **f_value, char **f_name);

para 为传递给回调函数的参数。f_num为记录中包含的字段数目,即列的数目。f_value为每个字段值的指针数组,f_name为每个字段名称的指针数组,成功返回0,失败返回-1。

因为每一个记录都会执行callback,所以每一行需要for循环输出每个列

 查询时也可以不用callback,使用:

sqlite3_get_table(sqlite3 *db, const char *sql, 
char ***resultp, int *nrow, int *ncolumn, char **errmsg);

其中,db为数据库句柄,sql为语句,resultp为指向sql结果的指针,nrow为满足条件的记录的数目,ncolumn为每条记录包含的字段数目,errmsg为错误信息,成功返回0,失败返回错误码

resultp为指向二维数组的指针,如下:

4.具体代码和结果

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#define DATABASE "stu.db"
int do_insert(sqlite3 *db){
    int id;
    char name[32] = {0};
    int score;
    char sql[128] = {0};
    char *errormsg;
    printf("input id:\n");
    scanf("%d", &id);
    printf("input name:\n");
    scanf("%s", name);
    printf("input score:\n");
    scanf("%d", &score);

    sprintf(sql, "insert into stu values(%d, '%s', %d);", id, name, score);
    if(sqlite3_exec(db, sql, NULL, NULL, &errormsg) !=SQLITE_OK){
        printf("%s\n", errormsg);
        return -1;
    }else{
        printf("insert done\n");
        return 0;
    }
};

int do_delete(sqlite3 *db){
    int id;
    char name[32] = {0};
    int score;
    char sql[128] = {0};
    char *errormsg;
    printf("delete id:\n");
    scanf("%d", &id);
   

    sprintf(sql, "delete from stu where id=%d;", id);
    if(sqlite3_exec(db, sql, NULL, NULL, &errormsg) !=SQLITE_OK){
        printf("%s\n", errormsg);
        return -1;
    }else{
        printf("delete done\n");
        return 0;
    }
};

int db_update(sqlite3 *db){
    int id;
    char name[32] = {0};
    int score;
    char sql[128] = {0};
    char *errormsg;
    printf("update id:\n");
    scanf("%d", &id);
    printf("update name:\n");
    scanf("%s", name);
    printf("update score:\n");
    scanf("%d", &score);

    sprintf(sql, "update stu set score = %d where id=%d;", score,id);
    if(sqlite3_exec(db, sql, NULL, NULL, &errormsg) !=SQLITE_OK){
        printf("%s\n", errormsg);
        return -1;
    }else{
        printf("update done\n");
        return 0;
    }
};

// 注意select要有回调函数和具体参数,每找到一个记录都会执行一次回调函数
int callback(void *para, int f_num, char **f_value, char **f_name){
    for(int i = 0; i<f_num;++i){
        printf("%s\n", f_value[i]);
    }
    return 0;
}
#if 0
int do_query(sqlite3 *db){
    int id;
    
    char *errormsg;
    printf("query id:\n");
    scanf("%d", &id);
    char sql[128] = {0};
    sprintf(sql, "select * from stu where id=%d;",id);
    // NULL对于callback的para
    if(sqlite3_exec(db, sql, callback, NULL, &errormsg) !=SQLITE_OK){
        printf("%s\n", errormsg);
        return -1;
    }else{
        printf("query done\n");
        return 0;
    }
};
#else
int do_query(sqlite3 *db){
    int id;
    char **resultp;
    char *errormsg;
    int nrow;
    int ncolumn;
    printf("query id:\n");
    scanf("%d", &id);
    char sql[128] = {0};
    sprintf(sql, "select * from stu where id=%d;",id);
    // NULL对于callback的para
    if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errormsg) !=SQLITE_OK){
        printf("%s\n", errormsg);
        return -1;
    }else{
        printf("query done\n");     
    }

    for(int i = 0;i<nrow;++i){
        for(int j = 0; j<ncolumn;++j){
            // +1是因为把表头跳过
            printf("%s\t", resultp[(i + 1) * ncolumn + j]);
        }
        printf("\n");
    }
};
#endif
int main(int argc, void *argv[]){
    sqlite3 *db;
    char *errmsg;
    if(sqlite3_open(DATABASE, &db) != SQLITE_OK){
        // 返回错误信息     
        printf("%s\n", sqlite3_errmsg(db));
        return -1;
    }else{
        printf("open DATABASE success\n");
    }
    char *sql = "create table stu (id Integer, name char, score Integer);";
    if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)!=SQLITE_OK){
        printf("%s\n", errmsg);
    }else{
        printf("create table success\n");
    }
    int cmd;
    while(1){
        printf("***************************");
        printf("1:insert,2:delete,3:query,4:update,5:quit\n");
        scanf("%d",&cmd);
        getchar();
        switch(cmd){
            case 1:
                do_insert(db);
                break;
            case 2:
                do_delete(db);
                break;
            case 3:
                do_query(db);
                break;
            case 4:
                db_update(db);
                break;
            case 5:
                break;
            default:
                printf("error cmd\n");
                return -1;
        }
    }
}

gcc -o mysqllite mysqllite.c -lsqlite3

03-25
### 关于 SQLite 数据库的使用指南 SQLite 是一种轻量级的关系型数据库管理系统,适合嵌入式应用和小型项目开发。以下是关于 SQLite 的一些核心概念及其使用的详细介绍。 #### 1. 权限管理的特点 SQLite 的权限管理功能相对简单,不像 MySQL 或 PostgreSQL 那样提供复杂的用户角色管理和细粒度访问控制。因此,在需要高级权限管理的应用场景中,建议评估是否切换至更强大的数据库系统[^1]。 #### 2. 版本控制与集成 对于 SQLite 数据库文件,可以将其纳入版本控制系统(如 Git),以便跟踪其结构变化或初始化脚本的历史记录。通过这种方式,团队成员能够协同维护数据库模式并减少冲突风险。 #### 3. 基础操作流程 当完成一系列数据库读写请求之后,务必调用 `sqlite3_close()` 函数释放资源以及断开连接。这是确保程序稳定性的重要一步。下面是一个简单的 C 语言代码片段展示如何安全地关闭 SQLite 连接: ```c #include <sqlite3.h> void close_database(sqlite3 *db) { if (sqlite3_close(db) != SQLITE_OK) { fprintf(stderr, "Database did not close cleanly\n"); } } ``` 上述函数定义了一个用于优雅退出的方法,并检查是否存在错误情况发生[^2]。 #### 4. React Native 中预加载 SQLite 数据库实例化过程 如果目标是在移动应用程序框架比如 React Native 下快速启动带有预先填充数据集的服务,则可以通过如下方式实现: - 构建一个名为 `your_mobile.db` 的 SQLite 文件,其中包含了所有的基础资料条目; - 接着按照官方文档指示将此 `.db` 资源复制粘贴进入 Android/iOS 平台特定目录路径之下[^3]; 这样做的好处在于减少了首次运行期间网络延迟或者冗长的数据迁移时间消耗。 --- ### 提供一段 Python 示例演示基本 CRUD 功能 这里给出一段基于 Python 的例子来说明怎样执行常见的增删改查命令: ```python import sqlite3 def create_connection(): conn = None; try: conn = sqlite3.connect('example.db') # 创建一个新的数据库 example.db 如果它不存在的话 print(f'Successfully connected to the database.') except Error as e: print(e) return conn def insert_data(conn): sql_insert_query = """ INSERT INTO projects(name,start_date,end_date) VALUES(?,?,?) """ project_details = ('My First Project', '2023-09-01', '2023-12-31') cur = conn.cursor() cur.execute(sql_insert_query, project_details) conn.commit() if __name__ == '__main__': connection = create_connection() if connection is not None: insert_data(connection) connection.close() ``` 以上脚本展示了建立链接、插入新纪录的过程最后记得总是要结束会话以防止内存泄漏等问题出现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值