【SQLite】指令,编程操作
SQLite简介
轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据库用于管理多端设备,更加复杂。
SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作为
应用程序的一部分运行。
MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互。
基于嵌入式的数据库主要有:SQLite
,Firebird
,Berkeley DB
,eXtremeDB
Firebird
是关系型数据库,功能强大,支持存储过程,SQL
兼容等
SQLite
关系型数据库,体积小,支持ACID
事务
Berkeley DB
并没有数据库服务器的概念,他的程序直接链接到应用程序中
eXtremeDB
是内存数据库,运行效率高。
SQLite数据库安装
1. 把下载的文件sqlite-autoconf-3390000.tar.gz上传到开发板
2. tar xvf sqlite-autoconf-3390000.tar.gz 解压
3. cd sqlite-autoconf-3390000 进入文件夹
4. ./configure --prefix=/usr/local 配置安装路径在/usr/local
5. make 编译//比较久10分钟
6. sudo make install 安装
如上图,安装成功过,运行sqlite3 进入SQL命令操作流程。
SQLite的命令
连接到数据库
sqlite3 database_name.db
在这里,database_name.db
是你要连接的数据库文件名。如果文件不存在,SQLite
会创建一个新的数据库文件。
退出 SQLite Shell
.exit
.quit
或者按 Ctrl + D
查询数据库
.databases
创建表
create table table_name (
column1 datatype,
column2 datatype,
...
);
插入数据
insert into table_name (column1, column2, ...) values (value1, value2, ...);
insert into student values(1, 'Carice', 100);
insert into student values(2, 'Zillion', 99);
insert into student(name, score) values('Geo', 98); 插入部分字段内容
查询数据
select column1, column2, ... from table_name where condition;
select * from student;
更新数据
update table_name set column1 = value1, column2 = value2, ... where condition;
删除数据
delete from table_name where condition;
查询所有表
.table
查看表结构
.schema table_name
删除一张表
drop table table_name;
增加一列
alter table table_name add column column type;
导入 SQL 脚本
.read path/to/script.sql
API
sqlite3_open
sqlite3_open
是SQLite库中的一个函数,用于打开或创建一个SQLite数据库文件,并返回一个指向该数据库的连接对象。以下是关于 sqlite3_open
函数的一些关键信息:
int sqlite3_open(
const char *filename, /* 数据库文件的路径或 ":memory:" 用于在内存中创建数据库 */
sqlite3 **ppDb /* 用于存储数据库连接对象的指针 */
);
参数
filename
:要打开或创建的数据库文件的路径。如果为NULL或者指定为":memory:",则在内存中创建一个临时数据库。
ppDb
:用于存储指向数据库连接对象的指针的地址。在函数成功调用后,这个指针将指向一个新的 sqlite3
对象,可以用于后续的数据库操作。
返回值
如果操作成功,返回 SQLITE_OK
(0)。
如果出现错误,返回一个错误代码。常见的错误代码包括 SQLITE_CANTOPEN
(不能打开数据库文件)和 SQLITE_MISUSE
(错误的使用方式)等。
示例
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
int main()
{
sqlite3 *db;
int ret_sqlite3_open = sqlite3_open("test.db", &db);
if(ret_sqlite3_open == -1)
{
printf("ret_sqlite3_open = %d\terror:%s", ret_sqlite3_open, sqlite3_errmsg(db));
exit(-1);
}
else
{
printf("sqlite3_open sucessfully!\n");
}
sqlite3_close(db);
printf("done\n");
return 0;
}
sqlite3_close
sqlite3_close
是SQLite库中的函数之一,用于关闭之前通过 sqlite3_open
打开的数据库连接。以下是有关 sqlite3_close
函数的一些关键信息:
int sqlite3_close(sqlite3 *db);
参数
db
:指向要关闭的数据库连接对象的指针。
返回值
如果操作成功,返回 SQLITE_OK
(0)。
如果出现错误,返回一个错误代码。常见的错误代码包括 SQLITE_BUSY
(数据库仍有活动的语句)和 SQLITE_MISUSE
(错误的使用方式)等。
sqlite3_errcode
sqlite3_errcode
是SQLite库中的一个函数,用于获取与最后一次数据库操作相关的错误代码。以下是有关 sqlite3_errcode
函数的一些关键信息:
int sqlite3_errcode(sqlite3 *db);
参数
db
:已经打开的SQLite数据库连接对象。
返回值
返回与最后一次数据库操作相关的错误代码。如果之前的操作没有错误,将返回 SQLITE_OK
(0)。
示例
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
char *errmsg = 0;
// 打开数据库连接
int rc = sqlite3_open("nonexistent.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
// 获取与最后一次数据库操作相关的错误代码
int errcode = sqlite3_errcode(db);
fprintf(stderr, "Error code: %d\n", errcode);
}
// 关闭数据库连接
sqlite3_close(db);
return 0;
}
在这个例子中,sqlite3_errcode
函数用于获取与最后一次数据库操作相关的错误代码。在这里,我们试图打开一个不存在的数据库文件,因此 sqlite3_open
函数将返回错误。然后,我们使用 sqlite3_errcode
来获取错误代码,并将其输出到控制台。在实际使用中,你可以根据这个错误代码进行相应的错误处理。
sqlite3_exec
sqlite3_exec
是SQLite库中的一个函数,用于执行一个或多个SQL语句,并通过回调函数处理结果。以下是有关 sqlite3_exec
函数的一些关键信息:
int sqlite3_exec(
sqlite3* db, /* 打开的数据库对象 */
const char *sql, /* 要执行的SQL语句 */
int (*callback)(void*,int,char**,char**), /* 回调函数,处理执行结果 */
void *data, /* 传递给回调函数的数据指针 */
char **errmsg /* 用于存储错误消息的指针 */
);
参数
db
:已经打开的SQLite数据库连接对象。
sql
:要执行的SQL语句。可以包含一个或多个SQL命令,以分号分隔。
callback
:回调函数,用于处理每个结果行。该函数的签名应该为 int callback(void*, int, char**, char**)
,其中参数分别是用户定义的数据指针(data
)、列数、列的数据数组、列的名称数组。
data
:传递给回调函数的用户定义的数据指针。
errmsg
:用于存储错误消息的指针。如果执行过程中发生错误,该指针将指向包含错误消息的字符串。
返回值
如果操作成功,返回 SQLITE_OK
(0)。
如果出现错误,返回一个错误代码。常见的错误代码包括 SQLITE_ERROR
(SQL语句执行错误)和 SQLITE_MISUSE
(错误的使用方式)等。
callback回调函数
回调函数(callback)是什么?一文理解回调函数(callback)
在SQLite中,sqlite3_exec
函数通常与回调函数一起使用,以处理执行SQL语句后的结果。回调函数是在每个结果行上调用的用户定义的函数,用于处理查询结果。
int callback(void *arg, int column_size, char *column_value[], char
*column_name[])
参数说明
void *arg
:用户提供的数据指针,可以用于传递额外的信息给回调函数,是 sqlite3_exec
函数的第四个参数 。
int column_size
:结果集的列数,数据库字段数。
char *column_value[]
:包含每一列的值的数组,列的值。
char *column_name
:包含每一列名称的数组,字段名字。
回调函数应该返回一个整数值,通常为 0
。如果返回非零值, sqlite3_exec
函数将停止执行并返回相同的值。
以下是一个简单的示例,演示如何使用 sqlite3_exec
与回调函数处理查询结果:
示例1 sqlite3_exec.c
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
int sqlite3_call_back(void *arg, int column_size, char *column_value[], char
*column_name[])
{
int i = 0;
for(i = 0; i < column_size; i++)
{
printf("%s : %s\n", column_name[i], column_value[i]);
}
printf("******************\n");
return 0;
}
int main()
{
sqlite3 *db;
char *errorMes = NULL;
int ret_sqlite3_open = sqlite3_open("test.db", &db);
if(ret_sqlite3_open == SQLITE_OK)
{
printf("sqlite3_open sucessfully!\n");
}
else
{
printf("ret_sqlite3_open = %d\terror:%s", ret_sqlite3_open, sqlite3_errmsg(db));
exit(-1);
}
//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
sqlite3_exec(db, "select * from student", sqlite3_call_back, "content of sql:", &errorMes);
sqlite3_close(db);
printf("done\n");
return 0;
}
示例2 sqlite3_exec_create_table.c
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
int sqlite3_call_back(void *arg, int column_size, char *column_value[], char
*column_name[])
{
int i = 0;
for(i = 0; i < column_size; i++)
{
printf("%s : %s\n", column_name[i], column_value[i]);
}
printf("******************\n");
return 0;
}
int main()
{
sqlite3 *db;
char *errorMes = NULL;
int ret_sqlite3_open = sqlite3_open("test_1.db", &db);
if(ret_sqlite3_open == SQLITE_OK)
{
printf("sqlite3_open sucessfully!\n");
}
else
{
printf("ret_sqlite3_open = %d\terror:%s", ret_sqlite3_open, sqlite3_errmsg(db));
exit(-1);
}
//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
int ret1 = sqlite3_exec(db, "create table Class01(id integer, name char, score float)", sqlite3_call_back, "content of sql:", &errorMes);
if(ret1 != 0)
{
fprintf(stderr, "ret1_err:%s\n", errorMes);
}
int ret2 = sqlite3_exec(db, "insert into Class01 values(01, 'Carice', 100)", sqlite3_call_back, "content of sql:", &errorMes);
if(ret2 != 0)
{
fprintf(stderr, "ret1_err:%s\n", errorMes);
}
sqlite3_exec(db, "insert into Class01 values(02, 'Zillion', 99)", sqlite3_call_back, "content of sql:", &errorMes);
sqlite3_exec(db, "select * from Class01", sqlite3_call_back, "content of sql:", &errorMes);
sqlite3_close(db);
printf("done\n");
return 0;
}