SQLite数据库
文章目录
- SQLite数据库
- 0、linux基础知识补充
- 1、SQLite简介
- 1.1 SQLite & MySQL 的优缺点比较
- 1.2 常见的嵌入式数据库
- 2、数据库的基本命令和用法
- 2.1 创建数据库
- 2.2 创建一张表格
- 2.3 插入一条数据
- 2.4 增加一列
- 2.5 删
- 2.6 改
- 2.7 查看数据库
- 3、数据库编程
- 3.1 实验1:打开/创建数据库C接口
- 3.2 实验2:创建表的C接口
- 3.2.1 callback()
- 3.2.2 sqlite_open()
- 3.2.3 sqlite_exec()
- 3.2.4 实验2
0、linux基础知识补充
-
cd -
:回到上一成执行目录 -
.configure
:是配置的意思 -
>>>.table -- 查看数据库中的表 >>>.databases -- 列出当前打开的数据库 >>>.databases -- 列出当前打开的数据库 >>>.quit -- 数据库退出
1、SQLite简介
- 轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据 库用于管理多端设备,更加复杂
- SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作为 应用程序的一部分运行。
- MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互。
1.1 SQLite & MySQL 的优缺点比较
SQLite优点 | SQLite缺点 | MySQL优点 | MySQL缺点 |
---|---|---|---|
1、基于文件,易于使用 | 1、功能欠缺:用户管理、安全功能 | 1、功能多 | 1、复杂一点,需要技术专业知识来识别 |
2、与SQL类似,微小更改 | 2、不易扩展,不适合大数据库、 | 2、易于扩展适用于大模型 | 2、与传统SQL语法略有不同 |
3、适合基础开发 | 3、无法定制 | 3、速度块 |
1.2 常见的嵌入式数据库
2、数据库的基本命令和用法
2.1 创建数据库
-- 打开方式一
sqlite3 -- 进入数据库
>>>.open test.db -- 打开数据库
>>>.quit
-- 数据库退出后在命令当前路径创建数据库test.db
-- 打开方式二
sqlite3 test.db -- 在命令运行当前窗口创建数据库test.db
-- 在数据库命令下
>>>.databases -- 列出当前打开的数据库
>>>.quit -- 退出
打开方式一 |
---|
打开方式二 |
---|
2.2 创建一张表格
create table stu2(id Integer,name char,score Integer); -- Integer整数
2.3 插入一条数据
insert into stu values(001,'tp',99);
insert into stu2 values(002,"s",100); -- ''和""都行
insert into stu(name,score) values("张三",98); -- 插入部分字段内容
2.4 增加一列
alter table stu add column sex char; -- 增加了性别一栏
2.5 删
-- 删除一条数据
delete from stu where id = 002;
-- 删除一张表
drop table stu
2.6 改
update stu set name = 'tp' where id = 000;
2.7 查看数据库
select * from stu; -- 查询所有字段的结果
select name,score from stu; -- 查询数据库中部分字段的内容
3、数据库编程
3.1 实验1:打开/创建数据库C接口
下面的 C 代码段显示了如何连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将 返回一个数据库对象。
//opensqlite.c
#include <stdio.h>
#include <sqlite3.h>
int main(char argc, char **argv)
{
sqlite3 *db;
int ret;
if(argc < 2)
{
printf("Usage: %s xxx.db\n",argv[0]);
return -1;
}
//sqlite3_open(const char *filename, sqlite3 **ppDb)
//第一个参数filename:要打开或创建的数据库文件的名称。如果文件不存在,SQLite 将尝试创建一个新的数据库文件
//用于存储指向打开的数据库连接的指针的指针
if( (ret = sqlite3_open(argv[1],&db)) == SQLITE_OK)
{
printf("open %s success\n",argv[1]);
}
else
{
//const char *sqlite3_errmsg(sqlite3*);
//sqlite3_errcode() 通常用来获取最近调用的API接口返回的错误代码.
printf("error:%s,%d",sqlite3_errmsg(db),ret);
if(ret = SQLITE_PERM)
{
printf("permission no\n");
}
return -1;
}
//sqlite3_close(sqlite3*)
//该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。
//如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。
sqlite3_close(db);
printf("done\n");
return 0;
}
实验1 打开/创建数据库C接口 结果 |
---|
3.2 实验2:创建表的C接口
-
下面的 C 代码段将用于在先前创建的数据库中创建一个表:
-
几个API
3.2.1 callback()
-
callback(void *arg, int column_size, char *column_value[], char *column_name[]) //void *arg:是sqlite3_exec函数的第四个参数 //colunm_size 表示数据库的数据库中的字段(Field),每个字段对应表中的一个列,一个表有几列就是几; //column_value[]:列的值 //column_name:字段名字
3.2.2 sqlite_open()
-
sqlite3_open(const char *filename, sqlite3 **ppDb) //第一个参数filename:要打开或创建的数据库文件的名称。如果文件不存在,SQLite 将尝试创建一个新的数据库文件 //用于存储指向打开的数据库连接的指针的指针
3.2.3 sqlite_exec()
-
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char**errmsg) //第二个参数sql:要执行的 SQL 查询语句,可以包含单个或多个 SQL 语句,每条语句以分号结束。 //第三个参数是一个回调函数callback,用于处理查询结果的每一行数据; //第四个参数data作为回调函数callback的第一个参数 void *arg; //第五个参数errmsg将被返回用来获取程序生成的任何错误。 //int callback(void *arg, int column_size, char *column_value[], char*column_name[]) //sqlite3_exec返回值为 0 时,表示操作成功完成
3.2.4 实验2
//creatSqlite.c
#include <stdio.h>
#include <sqlite3.h>
// int callback(void *arg, int column_size, char *column_value[], char*column_name[])
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{
printf("arg = %s\n",(char *)arg);
//void *arg:是sqlite3_exec函数的第四个参数
//colunm_size 表示数据库的数据库中的字段(Field),每个字段对应表中的一个列,一个表有几列就是几;
//column_value[]:列的值
//column_name:字段名字
for(int i = 0; i<column_size; i++)
{
printf("%s = %s\n",column_name[i],column_value[i]);
}
printf("======================================\n");
return 0;//必须返回0,这样数据库中有多少条数据,这个回调函数就会被调用多少次
}
int main(char argc, char **argv)
{
sqlite3 *db;
char *errorMes = NULL;
int ret;
if(argc < 2)
{
printf("Usage: %s xxx.db\n",argv[0]);
return -1;
}
//sqlite3_open(const char *filename, sqlite3 **ppDb)
//第一个参数filename:要打开或创建的数据库文件的名称。如果文件不存在,SQLite 将尝试创建一个新的数据库文件
//用于存储指向打开的数据库连接的指针的指针
if( (ret = sqlite3_open(argv[1],&db))==SQLITE_OK)
{
printf("open %s success\n",argv[1]);
}
else
{
//const char *sqlite3_errmsg(sqlite3*);
//sqlite3_errcode() 通常用来获取最近调用的API接口返回的错误代码.
printf("error:%s,%d",sqlite3_errmsg(db),ret);
if(ret = SQLITE_PERM)
{
printf("permission no\n");
}
return -1;
}
// sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char**errmsg)
//第二个参数sql:要执行的 SQL 查询语句,可以包含单个或多个 SQL 语句,每条语句以分号结束。
//第三个参数是一个回调函数callback,用于处理查询结果的每一行数据;
//第四个参数data作为回调函数callback的第一个参数 void *arg;
//第五个参数errmsg将被返回用来获取程序生成的任何错误。
//int callback(void *arg, int column_size, char *column_value[], char*column_name[])
//sqlite3_exec返回值为 0 时,表示操作成功完成
ret = sqlite3_exec(db,"create table Class03(id Integer,name char,score Integer);",\
callback,"content of sql:",&errorMes); //errorMes may sigment error
if(ret != SQLITE_OK)
//SQLITE_OK 是 SQLite 中的一个宏定义,表示操作成功完成的返回代码。
//在 SQLite 中,每个操作都会返回一个特定的返回代码,用于指示操作的结果。
//SQLITE_OK 代表操作成功完成,没有发生错误。
{
printf("creat tables error:%s\n",errorMes);//如果已经创建,会有errorMes提示
}
printf("go ahead\n");
ret = sqlite3_exec(db,"insert into Class03 values(002,'kkkk',99);",\
callback,"content of sql:",&errorMes); //errorMes may sigment error
printf("insert:%d,%s\n",ret,errorMes);//会有errorMes提示
ret = sqlite3_exec(db,"select * from Class03;",\
callback,"content of sql:",&errorMes); //errorMes may sigment error
printf("select:%d,%s\n",ret,errorMes);//会有errorMes提示
//sqlite3_close(sqlite3*)
sqlite3_close(db);
//该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完成。
//如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。
printf("done\n");
return 0;
}
- 相当于执行了
sqlite3 test2.db
>>>create table Class03(id Integer,name char,score Integer);
>>>insert into Class03 values(002,'kkkk',99);
>>>select * from Class03;
可以通过修改sqlite3_exec()函数中第二个参数,在sqlite3 里面运行不同数据库指令
- 实验2结果
欢迎大家一起交流讨论!