9.【SQLite】指令,编程操作

SQLite简介

轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据库用于管理多端设备,更加复杂。

SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作为
应用程序的一部分运行。
MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互。

在这里插入图片描述

基于嵌入式的数据库主要有:SQLiteFirebirdBerkeley DBeXtremeDB
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;
}

在这里插入图片描述

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值