SQlite C语言

SQLite

SQLite是一款轻量级数据库,是一个关系型数据库(RDBMS)管理系统,它包含在一个相对小的C库中,
实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎。
在很多嵌入式产品中使用了它,
它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。

它能够支持Windows/Linux/Unix/Android/IOS等等主流的操作系统,同时能够跟很多程序语言相结合,
比如C#、PHP、Java等, 更重要的是
SQLite文件格式稳定,跨平台且向后兼容,开发人员保证至少在2050年之前保持这种格式。
而且速度极快,目前是在世界上最广泛部署的SQL
数据库,据官网统计活跃使用的SQLite数据库超过1万亿,

更重要的是SQLite源代码不受版权限制,任何人都可以免费使用于任何目的。

大家可以参考官网的介绍: https://www.sqlite.org/index.html

SQLite安装

Windows

Windows推荐安装 sqlitestudio

sqlitestudio001

可视化操作数据库,不管是设计数据库还是查看数据库数据都很好用。

Linux

Linux上面安装sqlite和工具包

sudo apt-get -y install sqlite3

sudo apt-get install libsqlite3-dev

交叉编译SQLite

参考
https://taotaodiy-linux.readthedocs.io/en/latest/sql/crosssqlite.html

运行环境

sudo apt-get -y install sqlite3

SQLite使用

SQLite提供了一组点命令来操作SQLite数据库。

在终端输入 sqlite3 会进入SQLite终端,输入 .help 就可以查询这些点命令

➜  ~ sqlite3
SQLite version 3.27.2 2019-02-25 16:06:06
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILE name" to reopen on a persistent database.
sqlite> .help
.archive ...             # 管理SQL存档   
.auth ON|OFF             # 显示授权者回调
.backup ?DB? FILE        # 备份 DB 数据库(默认是 “main”)到 FILE 文件
.bail on|off             Stop after hitting an error.  Default OFF
.binary on|off           Turn binary output on or off.  Default OFF
.cd DIRECTORY            Change the working directory to DIRECTORY
.changes on|off          Show number of rows changed by SQL
.check GLOB              Fail if output since .testcase does not match
.clone NEWDB             Clone data into NEWDB from the existing database
.databases               # 列出数据库的名称及其所依附的文件
.dbconfig ?op? ?val?     List or change sqlite3_db_config() options
.dbinfo ?DB?             Show status information about the database
.dump ?TABLE? ...        # 以 SQL 文本格式转储数据库。如果指定了 TABLE 表,则只转储匹配 LIKE 模式的 TABLE 表。
.echo on|off             # 开启或关闭 echo 命令。
.import FILE TABLE       # 导入来自 FILE 文件的数据到 TABLE 表中
.indices ?TABLE?         # 显示所有索引的名称。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表的索引。
.log FILE\|off           # 开启或关闭日志。FILE 文件可以是 stderr(标准错误)/stdout(标准输出)。
.mode MODE ?TABLE?       # 设置输出模式,可选泽的模式:csv 、column 、html、insert、line 、list、list 、tabs 、tcl
.open ?OPTIONS? ?FILE?   # 关闭现有的数据库并重新打开文件
.output FILE name        # 发送输出到 FILE name 文件。
.output stdout           # 发送输出到屏幕。
.print STRING...         # 逐字地输出 STRING 字符串。 
.quit                    # 退出 SQLite 提示符终端。
.read FILE name          # 从FILE读取输入 
.schema ?PATTERN?        # 显示与PATTERN匹配的CREATE语句   
.show                    # 显示各种设置的当前值
.stats ON\|OFF           # 开启或关闭统计。 
.tables ?TABLE?          # 列出与LIKE模式TABLE匹配的表的名称
···

首先我们创建一个数据库,SQLite 的 sqlite3 命令被用来创建新的
SQLite数据库,
我们不需要任何特殊的权限即可创建一个数据,如果路径下存在相同名字的数据库则直接打开该数据库而不是重新创建。

SQLite数据库的创建和导入导出

#创建数据库
$sqlite3 test.db  
#将转换整个 test.db 数据库的内容到 SQLite 的语句中,并将其转储到 ASCII 文本文件 test.sql 中
$sqlite3 test.db .dump > test.sql   
#将test.sql 恢复到test.db
$sqlite3 test.db < test.sql

代码操作SQLite数据库

参考 https://www.runoob.com/sqlite/sqlite-c-cpp.html

# 若该数据库不存在则新建一个数据库
sqlite3_open(const char *filename, sqlite3 **ppDb)  
# 执行SQL语句
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
# 关闭之前打开的数据库
sqlite3_close(sqlite3*)
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

typedef int (*sqlite3_callback)(
            void*,    /* Data provided in the 4th argument of sqlite3_exec() */
            int,      /* The number of columns in row */
            char**,   /* An array of strings representing fields in the row */
            char**    /* An array of strings representing column names */   
            );

static int callback(void *data, int argc, char **argv, char **azColName)
//static int callback(int argc, char **argv, char **azColName)
{
    int i;
    //fprintf(stderr, "%s: ", (const char*)data);
    static int key=1;
    if(key)
    {
        for(i=0; i<argc; i++){
            printf("%s\t", azColName[i]);
        }
        printf("\n");
        key=0;
    }

    for(i=0; i<argc; i++){
        printf("%s\t", argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;           
}

//打开数据库,当数据库不存在时新建数据库
sqlite3* open_db()
{
    sqlite3 *db;
    char *ErrorMsg = NULL;
    int rce;

    rce = sqlite3_open("./database/test.db", &db);//数据库路径

    if( rce ){
       printf("连接数据库失败: %s\n", sqlite3_errmsg(db));
    }
    else{
       printf("数据库连接成功\n");
    }

    return db;
}

//关闭数据库
int close_db(sqlite3 *db)
{
    sqlite3_close(db);
    return 0;
}

//执行sql语句
int execute_sql(sqlite3 *db, char *sql)
{
    char *ErrorMsg = NULL;
    int rce;

    /* Execute SQL statement */
    rce = sqlite3_exec(db, sql, callback, NULL, &ErrorMsg);
    if( rce != SQLITE_OK  ){
        printf("SQL语句执行错误: %s\n", ErrorMsg);
        sqlite3_free(ErrorMsg);     
        return 0;       
    }
    else{
        printf("SQL语句执行成功\n");
    }

    return -1;
}

int main(int argc, char* argv[])
{
    sqlite3 *db;
    char *sql_creat_table;
    char *sql_insert;
    char *sql_select;
    char *sql_update;
    char *sql_delete;
    int rce;
    db=open_db();
    //创建表
    sql_creat_table = "CREATE TABLE Student(" \
          "ID INT PRIMARY KEY     NOT NULL," \
          "NAME           TEXT    NOT NULL," \
          "AGE            INT     NOT NULL," \
          "ADDRESS        CHAR(50)," \
          "SALARY         REAL );";

    sql_insert = "INSERT INTO Student (ID,NAME,AGE,ADDRESS,SALARY) "  \
          "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
          "INSERT INTO Student (ID,NAME,AGE,ADDRESS,SALARY) "  \
          "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "     \
          "INSERT INTO Student (ID,NAME,AGE,ADDRESS,SALARY)" \
          "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
          "INSERT INTO Student (ID,NAME,AGE,ADDRESS,SALARY)" \
          "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";

    sql_select= "SELECT * from Student";

    sql_update = "UPDATE Student set SALARY = 25000.00 where ID=1; " \
                    "SELECT * from Student";

    sql_delete= "DELETE from Student where ID=2; " \
                    "SELECT * from Student";

    rce=execute_sql(db, sql_creat_table);
    if(rce)
        printf("创建表成功\n");
    else
        printf("创建表失败\n");

    rce=execute_sql(db, sql_insert);
    if(rce)
        printf("插入数据成功\n");
    else
        printf("插入数据失败\n");

    rce=execute_sql(db, sql_select);
    if(rce)
        printf("查询数据成功\n");
    else
        printf("查询数据失败\n");

    rce=execute_sql(db, sql_update);
    if(rce)
        printf("更新数据成功\n");
    else
        printf("更新数据失败\n");

    rce=execute_sql(db, sql_delete);
    if(rce)
        printf("删除数据成功\n");
    else
        printf("删除数据失败\n");

    close_db(db);

    return 0;
}

相关错误以及解决办法

引用sqlite3.h报错

fatal error: sqlite3.h: 没有那个文件或目录
sudo apt-get install libsqlite3-dev

对’sqlite3_open’未定义的引用

gcc test.c -lsqlite3

原文链接

https://taotaodiy-linux.readthedocs.io/en/latest/sql/sqlite.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贪贪贪丶慎独

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

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

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

打赏作者

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

抵扣说明:

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

余额充值