sqlite3学习笔记

一、在ubuntu上安装sqlite数据库

1.安装sqlite3

sudo apt install sqlite3

2.安装sqlite编译所需要的工具包

sudo apt install libsqlite3-dev

 

二、sqlite3常用基本命令

1.系统命令

以“.”开头的命令为系统命令

.help  查看帮助

.quit  退出sqlite

.exit  退出sqlite

.schema  查看表的结构图

 

2.shell中的sqlite命令

sqlite命令不以“.”开头,但是要以“;”结尾

①建立一个数据库

 

 

 

②建立一张数据库表

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

结果可以使用系统命令.schema查看

 

 

 

③插入一条记录

输入全部数据

insert into stu values(1001,'zhangsan',80);

输入一部分数据

insert into stu (name,score) values("lisi",90);

结果可使用命令select * from stu;查看全部数据

 

 

 

查看部分数据 select name,score from stu;

 

 

匹配查询 select * from stu where score=80;

select * from stu where score=80 and name="zhangsan";

select * from stu where score=80 or name="lisi";

 

 

 

 

 

④删除一条记录

delete from stu where socre=90;

 

 

 

⑤更新一条记录

update stu set name="wangwu" where id=1001;

update stu set name="lisi" ,score=100 where id=1001;

 

 

 

⑥插入一列字段

alter table 数据库表名 add column 新增字段 字段类型

alter table stu add column address char;

 

 

 

⑦删除一列

sqlite3不支持直接删除一列,可通过以下方法删除

1--创建一张新表

  create table stu1 as select id,name,score from stu;

2--删除原有表

  drop table stu;

3--将新表的名字改成原来的旧表的名字

  alter table stu1 rename to stu;

 

 

 

三、sqlite3的C语言常用函数接口

1.sqlite3_open

int sqlite3_open(
  const char *filename,/ *数据库文件名(UTF-8)* /
  sqlite3 ** ppDb / * OUT:SQLite数据库句柄* /
);
功能:打开一个数据库
参数:filename  函数库路径
   ppDb    数据库操作句柄
返回值:成功返回SQLITE_OK,错误则返回错误码

 2.sqlite3_close

int sqlite3_close(sqlite3 *);
功能:关闭一个数据库
参数:数据库句柄
返回值:
成功返回SQLITE_OK,错误则返回错误码

 

3.sqlite3_errmsg

const char * sqlite3_errmsg(sqlite3 *);
功能:返回一串错误信息的地址
参数:数据库句柄
返回值:错误信息字符串地址

4.sqlite3_exec

int sqlite3_exec(
  sqlite3 *db,/ *一个打开的数据库* /
  const char * sql,/ *要求值的SQL * /
  int(* callback)(void *,int,char **,char **),/ *回调函数* /
  void* arg,/ *回调的第一个参数* /
  char ** errmsg / *此处写的错误msg * /
);
功能:执行一条sqlite操作语句,与shell中输入的一样
参数:db  数据库句柄
   sql  要执行的命令
   callback  回调函数,在搜索到一条数据时调用,每搜索到一条调用一次
   arg  传给回调函数的参数
   errmsg  传出参数,返回错误信息
返回值:
成功返回SQLITE_OK,错误则返回错误码

typedef int(*sqlite3_callback)(void *para,int f_num,char **f_value,char **f_name);
功能:每找到一条记录自动执行一次回调函数
参数:para  sqlite3_exec传入参数
   f_num  记录中包含的字段数目
   f_value 包含每个字段值的指针数组
   f_name  包含每个字段名称的指针数组
返回值:成功返回0,失败返回-1

5.sqlite3_get_table

int sqlite3_get_table(
  sqlite3 * db,/ *打开的数据库* /
  const char * zSql,/ *要求值的SQL * /
  char *** pazResult,/ *查询结果* /
  int * pnRow,/ *此处写入的结果行数* /
  int * pnColumn,/ *此处写入的结果列数* /
  char ** pzErrmsg / *此处写的错误消息* /
);
功能:执行sql操作
参数:db  数据库句柄
   zSql  要执行的语句
   pazResult  用来指向zSql执行结果的指针
   pnRow  结果的行数
   pnColumn  结果的列数
   pzErrmsg  
传出参数,返回错误信息
返回值:
成功返回SQLITE_OK,错误则返回错误码

pazResult返回的结果:

void sqlite3_free_table(char ** result);
功能:释放sqlite3_get_table中pazResult返回的结果
参数:result  
sqlite3_get_table中的pazResult


四、简单例子

简单实现数据库的增删改查
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

#define DATEBASE "./student.db"

int do_insert(sqlite3 *db)
{
    int id;
    char name[32];
    int score;
    char sql[128] = {};
    char *errmsg;

    printf("id:");
    scanf("%d",&id);
    getchar();

    printf("name:");
    scanf("%s",name);
    getchar();

    printf("score:");
    scanf("%d",&score);
    getchar();

    sprintf(sql,"insert into stu values(%d,'%s',%d)",id,name,score);

    if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
    {
        printf("insert fail\n");
        printf("%s\n",errmsg);
        return -1;
    }
    else
    {
        printf("insert success\n");
    }

    return 0;
}

int do_delete(sqlite3 *db)
{
    int id;
    char sql[128] = {};
    char *errmsg;

    printf("id:");
    scanf("%d",&id);
    getchar();

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

int do_update(sqlite3 *db)
{
    int id;
    int score;
    char sql[128] = {};
    char *errmsg;

    printf("id:");
    scanf("%d",&id);
    getchar();

    printf("score:");
    scanf("%d",&score);
    getchar();

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

int callback_query(void *param,int f_num,char **f_value,char **f_name)
{
    int i;

    for(i=0;i<f_num;i++)
    {
        printf("%-11s",f_value[i]);
    }
    putchar('\n');
    return 0;
}

int do_query(sqlite3 *db)
{
    char *errmsg;

    if(sqlite3_exec(db,"select * from stu;",callback_query,NULL,&errmsg)!=SQLITE_OK)
    {
        printf("query fail\n");
        printf("%s\n",errmsg);
        return -1;
    }
    else
    {
        printf("query success\n");
    }
    return 0;
}

int do_query_by_gettable(sqlite3 *db)
{
    char *errmsg;
    int nrow;
    int ncloumn;
    char **resultp;
    int i,j;
    int index = 0;

    if(sqlite3_get_table(db,"select * from stu;",&resultp,&nrow,&ncloumn,&errmsg)!=SQLITE_OK)
    {
        printf("get table fail\n");
        printf("%s\n",errmsg);
        return -1;
    }
    else
    {
        printf("get table success\n");
    }

    //打印字段
    for(i=0;i<ncloumn;i++)
    {
        printf("%-11s",resultp[i]);
    }
    putchar(10);

    //打印数据
    index = ncloumn;
    for(i=0;i<nrow;i++)
    {
        for(j=0;j<ncloumn;j++)
        {
            printf("%-11s",resultp[index++]);
        }
        putchar(10);
    }

    return 0;
}

int main(int argc,char **argv)
{
    sqlite3 *db;    //数据库句柄
    char *errmsg;
    int cmd;

    if(sqlite3_open(DATEBASE,&db)!=SQLITE_OK)
    {
        printf("%s\n",sqlite3_errmsg(db));
        return -1;
    }
    else
    {
        printf("open %s success\n",DATEBASE);
    }

    //创建一张数据库表格
    if(sqlite3_exec(db,"create table stu (id Integer,name char,score Integer))",NULL,NULL,&errmsg)!=SQLITE_OK)
    {
        printf("create table fail\n");
        printf("%s\n",errmsg);
    }
    else
    {
        printf("create or open table success\n");
    }

    while(1)
    {
        printf("************************************************\n");
        printf("1.insert 2.delete 3.query 4.update 5.quit\n");
        printf("************************************************\n");

        scanf("%d",&cmd);
        getchar();
        switch(cmd)
        {
            case 1:
                do_insert(db);
                break;
            case 2:
                do_delete(db);
                break;
            case 3:
                //do_query(db);    //回调函数方式查询
                do_query_by_gettable(db);    //gettable函数方式
                break;
            case 4:
                do_update(db);
                break;
            case 5:
                sqlite3_close(db);
                exit(1);
            default:
                printf("please input corrent cmd\n");
                break;
        }
    }

    return 0;
}

 

 

 

更多函数使用可以参考官方文档
sqlite3的官方API网站:https://www.sqlite.net.cn/c3ref/funclist.html
posted @ 2021-06-29 21:05  さくらむすび  阅读(323)  评论(0)    收藏  举报