SQLite基本使用及C语言示例
1、简介
sqlite3在2000年诞生,体积小(约250KB,3万行代码),是其他大型数据库的阉割版,集成了绝大多数的功能,但不是严格的数据类型匹配、不支持数据类型检测。轻量级的数据库,支持数据库大小至2TB,比目前流行的大多数数据库对数据操作要快。
2、安装(大部分Linux发行版本已经默认自带)
sudo apt-get install sqlite3
3、终端上的操作命令
3.1 进入sqlite3
sqlite3
3.2 系统命令(以“.”开头)
命令 | 功能 |
---|---|
.help | 帮助 |
.quit | 退出 |
.exit | 退出 |
.schema | 查看表的结构图 |
.database | 查看路径 |
.table | 查看数据库表 |
3.3 SQL基本命令(不以“.”开头,而是以“;”结尾)
创建数据库
sqlite3 student.db
创建一张数据库表stu,变量在前类型在后(char也可表示字符串)
create table stu(id Integer, name char, score Integer);
插入一组数据(char类型使用单引号和双引号都可以)
insert into stu values(1001, 'zhangsan', 80); // 所有值
insert into stu values(1002, "zhangsan2", 90);
insert into stu (id, name)values(1003, 'lisi'); // 插入部分值
查看
select * from stu; // 查看所有
select name from stu; // 查看指定部分
select id, name from stu;
select * from stu where score=80;
select * from stu where score=80 and id=1001;
select * from stu where score=80 or score=90;
删除
delete from stu; // 删除所有
delete from stu where name='zhangsan'; // 删除指定
delete from stu where name='zhangsan' and id=1001;
delete from stu where name='zhangsan' or id=1001;
更新(修改)
update stu set name='wangwu' where id=1001; // 将id为1001改名为wangwu
update stu set name="wangwu", score=85 where id=1001;
添加列
alter table stu add column address char; // 添加列(这里是address)
删除列(sqlite不支持删除列,可以制作新的表再删除旧的)
以删除address列为例:
create table stu1 as select id, name, score from stu; // 拷贝成新的数据库
drop table stu; // 删除旧的数据库
alter table stu1 rename to stu; // 将新的数据库改名
4、C语言API接口
参考:https://sqlite.org/c3ref/funclist.html
① 打开数据库
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
参数:filename 数据库路径名;
ppDb 数据库操作句柄(传出)。
返回:成功返回SQLITE_OK;
失败设置错误码,可用sqlite3_errmsg函数获取描述
② 关闭数据库
int sqlite3_close(sqlite3 *db);
参数:db 操作数据库的指针句柄;
返回:成功返回SQLITE_OK;失败则设置错误码
③ 查看错误信息
const char *sqlite3_errmsg(sqlite3 *db);
参数:db 操作数据库的指针句柄;
返回:描述错误信息的首地址
④ 执行一条sql语句
int sqlite3_exec(
sqlite3 *db, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void *arg,int,char**,char**), /* Callback function */
void *arg, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
参数:db 操作数据库的指针句柄;
sql 一条语句;
callback 回调函数,只有sqi为查询语句的时候才会调用该回调函数;
arg 给callback提供arg参数;
errmsg 错误信息
返回:成功返回SQLITE_OK
⑤ sqlite3_exec回调函数的形式
int (*callback)(void *para, int f_num, char **f_value, char **f_name);
功能:每找到一条记录自动执行一次回调函数
参数:para 传递给回调函数的参数;
f_num 记录中包含的字段数目,也就是“列”数;
f_value 每个字段值的指针数组;
f_name 每个字段名称的指针数组
返回:成功返回0,失败返回-1
⑥ 查询数据库
int sqlite3_get_table(
sqlite3 *db, /* An open database */
const char *zSql, /* SQL to be evaluated */
char ***pazResult, /* Results of the query */
int *pnRow, /* Number of result rows written here */
int *pnColumn, /* Number of result columns written here */
char **pzErrmsg /* Error msg written here */
);
参数:db 操作数据库的指针句柄;
zSql SQL语句;
pazResult 用来指向sql执行结果的指针;
pnRow 满足条件的记录的数目,也就是“行”数;
pnColumn 每条记录包含的字段数目,也就是“列”数;
pzErrmsg 错误信息指向的地址
返回:成功返回0,失败返回错误码
举个例子,有个数据库内容如下:
Name | Age
--------------
Alice | 43
Bob | 28
Cindy | 21
则azResult内容为:
azResult[0] = "Name";
azResult[1] = "Age";
azResult[2] = "Alice";
azResult[3] = "43";
azResult[4] = "Bob";
azResult[5] = "28";
azResult[6] = "Cindy";
azResult[7] = "21";
5、C语言使用示例
注意:编译时需要加上“-lsqlite3”链接参数。
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#define DATABASE "stu.db"
int do_insert(sqlite3 *db)
{
int id;
char name[12] = {};
int score;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d", &id);
getchar();
printf("Input name:");
scanf("%s", name);
getchar();
printf("Input 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("%s\n", errmsg);
} else {
printf("Insert done.\n");
}
return 0;
}
int do_delete(sqlite3 *db)
{
int id;
char sql[128] = {};
char *errmsg;
printf("Input 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("%s\n", errmsg);
} else {
printf("Delete done.\n");
}
return 0;
}
int do_update(sqlite3 *db)
{
int id;
int score;
char sql[128] = {};
char *errmsg;
printf("Input update id:");
scanf("%d", &id);
getchar();
printf("Update 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("%s\n", errmsg);
} else {
printf("Update done.\n");
}
return 0;
}
#if 0 /* 方法1:sqlite3_exec加回调函数方式 */
int callback(void *para, int f_num, char **f_value, char **f_name)
{
int i = 0;
/* 打印一行,因为每查找到一条记录都会调用一次回调函数 */
for(i = 0; i < f_num; i++)
{
printf("%-11s ", f_value[i]);
}
printf("\n");
return 0;
}
int do_query(sqlite3 *db)
{
char sql[128] = {};
char *errmsg;
sprintf(sql, "select * from stu;");
if(sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK){
printf("%s\n", errmsg);
} else {
printf("Query done.\n");
}
return 0;
}
#else /* 方法2:sqlite3_get_table函数方式 */
int do_query(sqlite3 *db)
{
char sql[128] = {};
char *errmsg;
char **resultp;
int nrow;
int ncloumn;
int i, j;
int index;
sprintf(sql, "select * from stu;");
if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncloumn, &errmsg) != SQLITE_OK){
printf("%s\n", errmsg);
} else {
printf("Query done.\n");
}
/* 打印抬头 */
for(j = 0; j < ncloumn; j++)
{
printf("%-11s ", resultp[j]);
}
printf("\n");
index = ncloumn;
for(i = 0; i < nrow; i++)
{
for(j = 0; j < ncloumn; j++)
{
printf("%-11s ", resultp[index++]);
}
printf("\n");
}
return 0;
}
#endif
int main(int argc, char **argv)
{
sqlite3 *db;
char *errmsg;
int cmd;
if(sqlite3_open(DATABASE, &db) != SQLITE_OK){
printf("%s\n", sqlite3_errmsg(db));
return -1;
} else {
printf("Open DATABASE success.\n");
}
if(sqlite3_exec(db, "create table stu(id Integer, name char, score Integer);", NULL, NULL, &errmsg) != SQLITE_OK){
printf("%s\n", errmsg);
} else {
printf("create table success.\n");
}
while(1)
{
printf("*********************************************\n");
printf("1:insert 2:delete 3:query 4:update 5:quit\n");
printf("*********************************************\n");
printf("please input your cmd:");
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:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
default:
printf("Error Cmd\n");
break;
}
}
return 0;
}