Linux C sqlite3安装步骤以及基本命令与相关函数

Linux C sqlite3安装步骤以及基本命令与相关函数,第1张

目录

sqlite3安装步骤

sqlite3基本命令

进入sqlite模式命令

系统命令(点命令--以"."开头)

sqlite语句(以";"结尾)

sqlite相关函数C/C++接口(头文件#include )

sqlite3_open()

sqlite3_close()

sqlite3_exec()

回调函数:

sqlite3_get_table()

sqlite3_free_table()

sqlite3_free()

代码示例

sqlite3_exec()回调与不回调查询数据库

sqlite3_get_table()不回调查询数据库


sqlite3安装步骤

sqlite3版本:sqlite-autoconf-3310100

平台:ubuntu

以下 *** 作需要sudo权限

①从官网下载对应的压缩包

lyt598@ubuntu:~$ wget https://www.sqlite.org/2020/sqlite-autoconf-3310100.tar.gz

②对压缩包进行解压

 lyt598@ubuntu:~$ tar -xzvf sqlite-autoconf-3310100.tar.gz

③进入到解压的文件夹内

lyt598@ubuntu:~$cd sqlite-autoconf-3310100/

④运行相应的配置文件

lyt598@ubuntu:~/sqlite-autoconf-3310100$ ./configure

⑤执行make命令,这一步比较慢,进行编译源程序,请耐心等待

lyt598@ubuntu:~/sqlite-autoconf-3310100$ make

注:如果这步执行有误,可以先执行make clean,先清除之前安装的sqlite3

⑥执行make install命令,需要sudo权限进行安装,否则会出错

lyt598@ubuntu:~/sqlite-autoconf-3310100$ sudo make install

./configure、make、make install相关命令解析


sqlite3基本命令 进入sqlite模式命令

sqlite3 进入sqlite模式,在命令提示行后输入

也可以直接sqlite3 数据库名 直接进入对应数据库,若该数据库不存在则就创建

系统命令(点命令--以"."开头)

①.help 帮助命令

②.quit 退出命令

③.show  查看 SQLite 命令提示符的默认设置

④.database (s)查看打开的数据库,以及他们的路径

⑤.open xx.db 打开对应的数据库,若不存在则创建

⑥.table(s) 查看对应数据库下的表(只显示表名)

⑦.schema 查看指定表的创建语句

sqlite语句(以";"结尾)

①增加 CREATE、INSERT、ALTER

  • 创建表 CREATE TABLE temperdata (id int, date char, temper char);
  • 插入数据 INSERT INTO "temperdata" VALUES(1, "2022-04-09", "28.5C");
  • 插入部分数据 INSERT INTO temperdata(id, temper) VALUES(2, "28.6C");
  • 添加一列 ALTER TABLE temperdata ADD place char

②删除 DROP、DELETE

  • 删除表 DROP TABLE temperdata
  • 删除表中某些记录 DELETE FROM temperdata WHERE id=1;
  • (删除数据库的话,可以直接把xx.db文件删除)

③修改 UPDATE

  • UPDATE temperdata SET temper=“29.1C” WHERE id=1;

④查看 SELECT

  • 查看整个表内容 SELECT * FROM "temperdata";
  • 查看表中的部分记录 SELECT date, temper FROM temperdata WHERE id=2;

sqlite相关函数C/C++接口(头文件#include ) sqlite3_open()

int sqlite3_open(const char *filename, sqlite3 **ppDb);

功能描述:打开一个数据库,如果该数据库不存在,sqlite则会自动创建

参数解析:①第一个参数是特定文件名(xx.db)

                  ②第二个参数是sqlite3 **结构体指针,成为数据库句柄(相当于是数据库的描述符)

返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值)

sqlite3 *db;
sqlite3_open("temperdata.db", &db);
sqlite3_close()

int sqlite3_close(sqlite3 *)

功能描述:关闭之前调用的数据库连接,所有与连接相关的语句都应该在关闭之前完成

参数解析:就是先前连接定义的数据库句柄(相当于数据库描述符)

返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值),其中如果是查询没有完成,则返回SQLITE_BUSY

sqlite3 *db;
sqlite3_close(db);
sqlite3_exec()

int sqlite3_exec(sqlite3 *, const char *sql, int (*callback)(void *, int, char **, char **),

                             void *data, char **errmsg)

功能描述:编译和执行sql语句,将查询到的结果返回给回调函数callback

参数解析:

①第一个参数是打开的数据库句柄

②第二个参数是一个字符指针,表示所要执行的sql语句字符串,以'\0'结尾

③第三个参数是一个回调函数,用来处理查询结果,如果不需要回调则NUL填L(比如insert或delete *** 作时),一般用于SELECT

④第四个参数是传给回调函数的指针参数,如果不需要传递,则值填NULL

⑤第五个参数是返回错误信息,这里是指针的指针

返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值)

注意:使用回调会显得代码整齐

回调函数:

回调函数:是由函数指针调用的函数。


在c代码编程中可以这样理解,函数F1调用函数F2的时候,通过参数给函数F2传递了另一个函数F3的指针,在函数F2执行的时候,函数F2调用了F3,这个动作叫做回调(Callback),而先被当作指针参数传入、然后又被回调的函数F3就是回调函数(也叫钩子函数Hook)

typedef int (*sqlite_callback)(void *para, int columncount, char **columnvalue,

                   char **columnname);

功能描述:由用户处理查询的结果

参数解析:

①第一个参数para指针,是sqlite3_exec()传入的指针参数

②第二个参数columncount是查询到的这一条记录共有多少个字段(相当于多少列)

③第三个参数columnvalue将查询出来的数据都保持在这里,这是一个一维数组,每一个元素都是一个char *值,是一个字段内容(用字符串来表示)

④第四个参数columnname是与columnvalue对应的,也是一个一维数组,代表这个字段名称

返回值:执行成功则返回SQLITE_OK(0),否则返回其他值(非0)

PS:回调函数执行一次或n次,大多数情况下是会循环执行n次。


当我们进行SELSCT查询的时候,输出的结果有几行,就会执行几次回调函数

sqlite3_get_table()

注意:前面sqlite3_exec()使用回调会显得代码整齐,但是有时候想要使用非回调的SELECT查询,就可以使用sqlite3_get_table()

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 */
);

功能描述:主要是用于以非回调的方式进行SELECT查询

参数解析:

①第一个参数是一个数据库句柄,是打开数据库得到的指针

②第二个参数是一条sql语句,与sqlite3_exec()中的一样,以'\0'结尾的字符串

③第三个参数是查询的结果,是一个一维数组,它的内存布局是:字段名称,后面是紧接着每个字段的值(就是列表名,后面跟着一个一个数据)

④第四个参数是查询出多少条记录(即查出多少行,不包括字段名的那一行)

⑤第五个参数是有多少字段(多少列)

⑥第五个参数是返回错误信息,这里是指针的指针

返回值:成功则返回SQLITE_OK(0),失败则返回其他错误信息(非0值)

注意:第三个参数pazResult返回的字符串数量实际上是(*pnRow+1)*(*pnColumn),包括字段名

sqlite3_free_table()

void sqlite3_free_table(char **result)

功能描述:用来释放保存查询内容的指针数组

参数解析:是sqlite3_get_table()的第三个参数的查询结果

无返回值

sqlite3_free()

void sqlite3_free(void *)

功能描述:用来释放存放错误信息的内存空间,如果由错误发生,就要释放内存

参数描述:错误信息指针

无返回值

char    *zerrmsg;
sqlite3_free(zerrmsg);

代码示例 sqlite3_exec()回调与不回调查询数据库

linyuting@Raspberrypi4B:~$vim test.c

#include 
#include 
#include 
#include 
#include 

static int callback(void *para, int argc, char **argv, char **cname);

int main(int argc, char **argv)
{
	int         rc = 0;
	sqlite3    *db = NULL;
	char       *sql;
	char       *sql1;
	char       *sql2;
	char       *sql3;
	char       *data = "Callback function called";
	char       *zerrmsg = NULL;


//1、打开数据库,不存在,则创建它
	rc = sqlite3_open("testsqlite.db", &db);
	if( rc < 0 )
	{
		printf("open the database failure: %s\n", strerror(errno));
		return -1;
	}
	printf("open the testsqlite.db successfully.\n");

//2、在该数据库中创建表,若表存在,则就不创建
	sql = "CREATE TABLE IF NOT EXISTS STUDENT(\
	       ID INT PRIMARY KEY,\
	       NAME TEXT,\
	       AGE INT\
	       );";
	if( sqlite3_exec(db, sql, NULL, NULL, &zerrmsg) != SQLITE_OK )
	{
		printf("create the table failure: %s\n", strerror(errno));
		sqlite3_free(zerrmsg);
		return -2;
	}
	printf("create the table successfully.\n");


//3、往表中插入数据,这是sqlite3_exec()非回调的使用
	sql1 = "INSERT INTO STUDENT VALUES (2019001, 'zhangsan', 20);";
	if( sqlite3_exec(db, sql1, NULL, NULL, &zerrmsg) != SQLITE_OK )
	{
		printf("insert the message into table failure: %s\n", strerror(errno));
		sqlite3_free(zerrmsg);
		return -3;
	}
	printf("insert the message into table successfully.\n");

        sql2 = "INSERT INTO STUDENT VALUES (2019002, 'lisi', 21);";
        if( sqlite3_exec(db, sql2, NULL, NULL, &zerrmsg) != SQLITE_OK )
        {
                printf("insert the message into table failure: %s\n", strerror(errno));
                sqlite3_free(zerrmsg);
                return -4;
        }
        printf("insert the message into table successfully.\n");
	

//4.从表中查询数据,这是sqlite3_exec()回调的调用
	sql3 = "SELECT * FROM STUDENT";
	if( sqlite3_exec(db, sql3, callback, (void *)data, &zerrmsg) != SQLITE_OK )
	{
		printf("select from table failure: %s\n", strerror(errno));
		sqlite3_free(zerrmsg);
		return -5;
	}	
	printf("select from table successfully.\n");

	sqlite3_close(db);
	return 0;
}

//回调函数
static int callback(void *para, int argc, char **argv, char **cname)
{
	int     i;

	printf("%s\n", (char *)para);
	printf("the table column is %d\n", argc);
		for(i=0; i

linyuting@Raspberrypi4B:~$gcc test.c -o test -lsqlite3(注意在编译的时候一定要加上-sqlite3,包含相关的头文件,否则会出错)

linyuting@Raspberrypi4B:~$./test

由此可见,因为有两条记录,相当于输出两行,所以回调函数执行两次


sqlite3_get_table()不回调查询数据库

linyuting@Raspberrypi4B:~$vim test.c

#include 
#include 
#include 
#include 
#include 


int main(int argc, char **argv)
{
	int         rc = 0;
	int         i = 0;
	sqlite3    *db = NULL;
	char       *sql;
	char       *sql1;
	char       *sql2;
	char       *sql3;
	char      **result;
	int         nrow = 0;
	int         ncolumn = 0;
	char       *zerrmsg = NULL;

//1、打开数据库,不存在,则创建它
	rc = sqlite3_open("testsqlite.db", &db);
	if( rc < 0 )
	{
		printf("open the database failure: %s\n", strerror(errno));
		return -1;
	}
	printf("open the testsqlite.db successfully.\n");


//2、在该数据库中创建表
	sql = "CREATE TABLE IF NOT EXISTS STUDENT(\
	       ID INT PRIMARY KEY,\
	       NAME TEXT,\
	       AGE INT\
	       );";
	if( sqlite3_exec(db, sql, NULL, NULL, &zerrmsg) != SQLITE_OK )
	{
		printf("create the table failure: %s\n", strerror(errno));
		sqlite3_free(zerrmsg);
		return -2;
	}
	printf("create the table successfully.\n");

//3.往表中插入数据,这是sqlite3_exec()非回调的使用
	sql1 = "INSERT INTO STUDENT VALUES (2019001, 'zhangsan', 20);";
	if( sqlite3_exec(db, sql1, NULL, NULL, &zerrmsg) != SQLITE_OK )
	{
		printf("insert the message into table failure: %s\n", strerror(errno));
		sqlite3_free(zerrmsg);
		return -3;
	}
	printf("insert the message into table successfully.\n");

    sql2 = "INSERT INTO STUDENT VALUES (2019002, 'lisi', 21);";
    if( sqlite3_exec(db, sql2, NULL, NULL, &zerrmsg) != SQLITE_OK )
    {
            printf("insert the message into table failure: %s\n", strerror(errno));
            sqlite3_free(zerrmsg);
            return -4;
    }
    printf("insert the message into table successfully.\n");
	

//4、查询表中数据,这里使用的是sqlite3_get_table()非回调方法
	sql3 = "SELECT * FROM STUDENT";
	if( sqlite3_get_table(db, sql3, &result, &nrow, &ncolumn, &zerrmsg) != SQLITE_OK )
	{
		printf("select from table failure: %s\n", strerror(errno));
		sqlite3_free(zerrmsg);
		return -5;
	}	
	printf("select from table successfully.\n");

	printf("the total row is %d, column is %d\n", nrow, ncolumn);
	printf("the result is:\n");
	
//将查询到的结果,通过数组遍历出来
	for(i=0; i<(nrow+1)*(ncolumn); i++)
	{
		printf("%s\n", result[i]);
	}

	sqlite3_close(db);
	return 0;
}

linyuting@Raspberrypi4B:~$gcc test.c -o test -lsqlite3

linyuting@Raspberrypi4B:~$./test

 由此可见,sqlite3_get_table()非递归调用的代码没有sqlite3_exec()递归调用显得整齐。


               

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/607455.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)