Linux数据库(sqlite3)

数据库和表
SQLite将每个数据库都保存成一个文件。
数据库中的数据被组织成表的形式。
表由若干拥有相同字段的记录组成。
表可以为空,即拥有0条记录。
字段指的是记录中的数据域,它有不同的类型,可以是一个数值,也可以是字符串。
每个表中可以指定一个或多个字段为主键,表中所有记录的主键的值都不能重复。这种不重复是在插入记录时控制的,即如果向一个表中插入记录时,这个表中已有与插入记录具有相同主键的记录,则插入操作失败。

sqlite3命令行工具
SQLite库包含一个简单的命令行工具:sqlite3,该工具使得用户可以对一个SQLite数据库手动输入并且执行SQL语句。

如下命令可以启动sqlite3工具:
sqlite3 student.db
其中student.db是要操作的数据库文件,如果它不存在,则会自动创建一个新的空数据库。

.exit ,退出sqlite互动模式的命令
.help,列出命令的提示信息。
.tables显示数据库中所有表名
.schema 查看表的结构
.database 显示当前打开的数据库文件

sqlite3的基本操作语句
①用create语句可以在数据库中创建表
create table student(
ID INTEGER,
name TEXT,
sex TEXT,
age INTEGER,
primary key(ID)
);

②用insert语句可以向表中插入一条新记录
insert into student values(1, ‘Zhang’, ‘M’, 18);

③用update语句可以可以修改表中的记录
update student set Sex = ‘F’, Age = 20 where Name = ‘Zhang’;
where及其后的部分表示一个过滤条件,如果省略where和它后面的部分,则语句的作用就是修改表student中的所有记录,将它们的Sex字段的值设为F,Age字段的值设为20。

④用delete语句可以删除表中的记录
delete from student where ID = 2;
如果没有where子句,则表student中的所有记录均被删除,成为空表。

⑤用select语句可以对数据库进行查询
select ID, Name from student where Sex = ‘F’;

sqlite3编程接口
sqlite 里最常用到的是 sqlite3 * 类型。从数据库打开开始,sqlite就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。当数据库打开时开始,这个类型的变量就代表了你要操作的数据库。下面再详细介绍。(首先要定义一个sqlite3的对象,如:sqlite3 *database_;)
①打开数据库

int sqlite3_open( 文件名, sqlite3 ** );

用这个函数开始数据库操作。需要传入两个参数,一是数据库文件名,比如:database.db。文件名不需要一定存在,如果此文件不存在,sqlite 会自动建立它。如果它存在,就尝试把它当数据库文件来打开。sqlite3 ** 参数即前面提到的关键数据结构。这个结构底层细节如何,你不要管它。函数返回值表示操作是否正确,如果是 SQLITE_OK 则表示操作正常。相关的返回值sqlite定义了一些宏。具体这些宏的含义可以参考 sqlite3.h 文件。里面有详细定义(顺便说一下,sqlite3 的代码注释率自称是非常高的,实际上也的确很高。只要你会看英文,sqlite 可以让你学到不少东西)。

②关闭数据库

int sqlite3_close(sqlite3 *);

数据库的打开和关闭

#include <stdio.h>
#include <sqlite3.h>   // 数据库的头文件

int main()
{
    sqlite3 * database;

    // 打开数据库
    int ret = sqlite3_open("student.db", &database);
    if (ret != SQLITE_OK)
    {
        printf ("打开数据库失败\n");
        return -1;
    }

    printf ("打开数据库成功\n");

    // 关闭数据库
    sqlite3_close(database);
    return 0;
}

③SQL语句操作:执行sql语句

int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *,  char **errmsg );

这就是执行一条 sql 语句的函数。第1个参数不再说了,是前面open函数得到的指针。说了是关键数据结构。第2个参数const char *sql 是一条 sql 语句,以/0结尾。第3个参数sqlite3_callback 是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。(什么是回调函数,自己找别的资料学习)
第4个参数void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。
第5个参数char **errmsg 是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行 sqlite3_exec 之后,执行失败时可以查阅这个指针(直接 printf(“%s/n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个 char得到具体错误提示。说明:通常,sqlite3_callback 和它后面的 void * 这两个位置都可以填 NULL。填NULL表示你不需要回调。比如你做insert 操作,做 delete 操作,就没有必要使用回调。而当你做 select 时,就要使用回调,因为 sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。

执行SQL语句

#include <stdio.h>
#include <sqlite3.h>   // 数据库的头文件

int main()
{
    sqlite3 * database;

    // 打开数据库
    int ret = sqlite3_open("student.db", &database);
    if (ret != SQLITE_OK)
    {
        printf ("打开数据库失败\n");
        return -1;
    }

    printf ("打开数据库成功\n");

    char *errmsg = NULL;
    char *sql = "create table if not exists student(ID INTEGER,name TEXT,sex TEXT,age INTEGER,primary  key(ID))";
    ret = sqlite3_exec(database, sql, NULL, NULL, &errmsg);
    if (ret != SQLITE_OK)
    {
        printf ("数据库操作失败:%s\n", errmsg);
        return -1;
    }

    int id;
    char name[20];
    char sex[2];
    int age;
    printf ("请输入ID:\n");
    scanf ("%d", &id);

    printf ("请输入用户名:\n");
    scanf ("%s", name);

    printf ("请输入性别:\n");
    scanf ("%s", sex);

    printf ("请输入年龄:\n");
    scanf ("%d", &age);

    // insert into student values(id, name, sex, age);
    char buf[100];
    sprintf (buf, "insert into student values(%d, '%s', '%s', %d)", id, name, sex, age);
    ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg);
    if (ret != SQLITE_OK)
    {
        printf ("数据库操作失败:%s\n", errmsg);
        return -1;
    }

    // 关闭数据库
    sqlite3_close(database);
    return 0;
}

利用回滚函数查询数据库

#include <stdio.h>
#include <sqlite3.h>   // 数据库的头文件

// 1、exec传过来的参数
// 2、代表查询的列数
// 3、char** value  代表一条记录的值 char *value[] = {"1", "zhang1", "M", "12"};
// 4、char** name   代表每一列的字段 char *name[]  = {"id", "name", "sex", "age"};

// 每查到一条记录,该函数被调用一次
int msg(void* v, int num, char** value, char** name)
{
    int i;
    for (i = 0; i < num; i++)
    {
        printf ("%s : %-8s", name[i], value[i]);
    }

    printf ("\n");

    return 0;  // 函数内部一定要返回一个0
}


int main(int argc, char *argv[])
{
    sqlite3 * database;

    // 打开数据库
    int ret = sqlite3_open("student.db", &database);
    if (ret != SQLITE_OK)
    {
        printf ("打开数据库失败\n");
        return -1;
    }

    printf ("打开数据库成功\n");

    char *errmsg = NULL;
    char *sql = "select * from student";
    ret = sqlite3_exec(database, sql, msg, NULL, &errmsg);
    if (ret != SQLITE_OK)
    {
        printf ("数据库操作失败:%s\n", errmsg);
        return -1;
    }

    // 关闭数据库
    sqlite3_close(database);
    return 0;
}

④查询函数sqlite3_get_table

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

第1个参数不再多说,看前面的例子。
第2个参数是 sql 语句,跟 sqlite3_exec 里的 sql 是一样的。是一个很普通的以/0结尾的char *字符串。
第3个参数是查询结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:第一行是字段名称,后面是紧接着是每个字段的值。
第5个参数是多少个字段(多少列)。
第6个参数是错误信息,跟前面一样,这里不多说了。

查询数据库

#include <stdio.h>
#include <sqlite3.h>   // 数据库的头文件

int main(int argc, char *argv[])
{
    sqlite3 * database;

    // 打开数据库
    int ret = sqlite3_open("student.db", &database);
    if (ret != SQLITE_OK)
    {
        printf ("打开数据库失败\n");
        return -1;
    }

    // 3、char ***resultp: char *resultp[] = {"id", "name", "sex", "age", "1", "zhang", "M", "12","2".....};
    // 4、nrow: 多少行数据
    // 5、ncolumn: 多少列数据
    char *errmsg = NULL;
    char **resultp = NULL;
    int nrow, ncolumn;
    char *sql = "select * from student";
    ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg);
    if (ret != SQLITE_OK)
    {
        printf ("数据库操作失败:%s\n", errmsg);
        return -1;
    }   


    int i;
    printf ("nrow = %d, ncolumn = %d\n", nrow, ncolumn);
    for (i = 0; i < (nrow+1)*ncolumn; i++)
    {
        if (i % ncolumn == 0)
            printf ("\n");
        printf ("%-8s", resultp[i]);
    }
    printf ("\n");  


    sqlite3_free_table(resultp);
    // 关闭数据库
    sqlite3_close(database);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值