Linux下的SQLite数据库的基本使用

目录

1.Linux下的数据库介绍

2.嵌入式数据库的特点以及分类

(1)特点

(2)分类

3.嵌入式数据库的应用

4.SQLite数据库的安装

(1)安装SQLite数据库

(2)SQLite数据库可视化界面软件安装

5.SQLite数据库的一些基本命令

6.SQLite相关表的操作

(1)创建表

(2)表中插入数据

(3)查询表中的数据

(4)更改表中的数据

(5)建立索引

(6)删除数据和删除表

7.SQLite数据库的API函数

(1)打开数据库

(2)关闭数据库

(3)执行函数

(4)释放内存函数

(5)显示错误信息

(6)获取结果集

(7)释放结果集

(8)声明SQL语句

(9)销毁SQL语句

(10)重置SQL语句

(11)实例解释

(12)关于SQLite几点情况


1.Linux下的数据库介绍

提示:如果读者对于Oracle数据库了解的话,那么对于SQLite数据库的相关操作也类似。

Oracle学习的相关知识点(汇总)

嵌入式数据库将数据库系统与操作系统和具体应用集成在一起,运行在各种智能嵌入式设备上。与传统的数据库系统相比,它一般体积较小,有较强的便携性和易用性,以及较为完备的功能来实现用户对数据库的管理操作。

嵌入式数据库的名称来自其独特的运行模式。这种数据库嵌入到了应用程序进行运行时,消除了与客户机服务器配置相关的开销。嵌入式数据库实际上是轻量级的,在速度更快,需要较少的内存。

2.嵌入式数据库的特点以及分类

(1)特点

  •  嵌入式数据库不仅可以嵌入式到其他的软件当中,也可以嵌入到硬件设备当中。
  • 嵌入式系统能够在没有人工干预的情况下长时间不间断的运行。
  • 实时性。
  • 嵌入式数据库具有一定较好的移动性。

(2)分类

  •  软件嵌入式数据库
    • 面向软件的嵌入式数据库,将数据库作为组件嵌入到其他的软件系统中,一般对于数据库的安全性,稳定性和速度要求比较高。
  • 设备嵌入式数据库
    • 将关系型数据库嵌入到设备当中去,作为设备资源数据处理的核心组件,要求具有很高的实时性和稳定性。
  • 内存数据库
    • 数据库直接在内存中运行,数据处理更加高速,但是安全性方面需要额外的手段来保障。

3.嵌入式数据库的应用

  •  医疗领域
  • 军事设备和系统
  • 地理信息系统
  • 工业控制
  • 网络通信
  • 空间搜索
  • 消费类电子

4.SQLite数据库的安装

开始安装软件的时候可能需要换源:Ubuntu换源教程

SQLite对SQL92标准的支持包括索引,限制,触发和查看。SQLite不支持外键限制,但支持原子的,一致的,独立的和持久的事务。

  • 原子的:它们要么完全执行,要么根本不执行;
  • 一致的:在不一致的状态中,数据库从未被保留;
  • 独立的:在同一时间同一数据库上有两个执行操作的事务,那么这两个事务互不干扰;
  • 持久的:数据库能够在崩溃和断点的情况下不丢失数据或损坏。

SQLite数据库包含的组件:SQL编译器,内核,后端以及附件。

SQLite支持高达2TB的数据库,每个数据库完全存储在单个磁盘文件中,这些磁盘文件在不同字节顺序的计算机之间移动。 

(1)安装SQLite数据库

下载:sudo apt-get install sqlite

打开:sqlite3 mydb.db

提示:读者也可以到官网下载源码编译安装:SQLite数据库官网源码下载 

(2)SQLite数据库可视化界面软件安装

下载:sudo apt-get install sqlitebrowser

打开:sqlitebrower

 

5.SQLite数据库的一些基本命令

SQLite基本操作命令
命令说明
.database列出附加数据库的名称和文件
.open [数据库名称]打开数据库
.chanages on |off显示SQL更改的行数
.table查看当前数据库下的表
.schema查看数据库的表结构
.quit退出数据库
.exit退出数据库
.output查询的结果输出到文件,如:.output demo.txt
.dump输出表结构,同时输出操作记录,可以创建一个包含必要命令和数据的文件。

 

 

6.SQLite相关表的操作

字段类型
类型说明
integer无符号整形
varchar(20)可变长的字符数据
text文本字符串,存储使用的编码方式为UTF-8、UTF-16BE、UTF-16LE
real浮点型
blob存储Blob数据,该类型数据和输入数据完全相同。

(1)创建表

create table [创建表名](属性1,属性2,属性3……)

如:create table demo(id integer,name varchar(20))

(2)表中插入数据

insert into table_name values(data1,data2,……)

如:insert into demo values(1,'tom');

(3)查询表中的数据

select column from table_name where expression;

如:查询表中id=1的信息

select *

        from demo

        where id=1;

  

(4)更改表中的数据

update table_name set data1=[修改的值] where expression;

如:修改id=1的信息

update demo

        set name='gupdf'

        where id=1;

(5)建立索引

create index index_name on table_name (field_to_be_indexed);

如:对表demo的id建立一个索引sea

create index

        sea on demo(id);

(6)删除数据和删除表

删除数据:delete from table_name where expression;

如:delete from demo where id=1;

删除表:drop table table_name;

drop table demo;

7.SQLite数据库的API函数

在使用SQLite数据库的API之前,首先了解一些知识点:

SQLite的API学习手册

SQLite的API官方教程

我们在使用SQLite3之前都是需要导入头文件了<sqlite3.h>

但是这个头文件在下载的sqlite3中是不包含的,看下:

可以下载sqlite3文件查看里面并不包含include文件:sudo apt-get download sqlite3

下载sqlite3头文件:

SQLite3头文件下载

 

知识点来源:知识点来源 

(1)打开数据库

int sqlite3_open(

        const char*filename,//数据库名称

        sqlite3**ppDb//输出参数,SQLite数据库句柄

);

提示:该函数用来打开或者创建一个SQLite数据库。

  • 如果在包含该函数的文件所在的路径下有同名的数据库(*.db),则打开数据库;
  • 如果不存在数据库,则在该路径下创建一个同名的数据库。
  • 如果打开或者创建数据库成功,则该函数返回0,输出参数为SQLite3类型的变量,后序对该数据库的操作,通过参数进行传递。

(2)关闭数据库

格式:int sqlite3_close(sqlite3*db);

提示:结束对数据库的操作之后需要调用该函数关闭数据库,该函数的参数为成功打开数据库时输出参数——SQLite3类型变量(句柄)

(3)执行函数

格式:

int sqlite3_exec(

        sqlite3*,//打开数据库的名称

        const char*sql,//要执行的SQL语句

        sqlite_callback,//回调函数

        void*,//回调函数的参数

        char **errmsg//错误信息

)

提示:如果要对数据库进行操作,即可使用该函数来完成。如果出现错误信息的话,可以相应的错误信息保存到errmsg中。

(4)释放内存函数

格式:void sqlite3_free(char*z)

提示:在对数据库操作时,如果需要释放在中间过程中保存在内存中的数据,则可以通过此函数来清除内存空间。

(5)显示错误信息

格式:const char *sqlite3_errmsg(sqlite3*)

提示:将在对数据库的操作过程出现的错误信息通过此函数输出。

(6)获取结果集

格式:int sqlite3 _get_table(        

        sqlite3*,//打开数据库名称

        const char*sql,//执行的SQL语句

        char***resultp,//输出的结果

        int *nrow,//输出结果的行数

        int *ncolumn,//输出结果的列数

        char**errmsg//错误信息

)

提示:对数据库进行操作时,通过此函数来获取结果。

函数的入口参数为查询的SQL语句,出口参数为二维指针,指示查询结果的内容,还有结果的行数和列数,行数为纯记录条数,但是resultp数组里面包含了一行字段名的值。

resultp输出的结果应该是下面的样子(了解输出的结果才能很好的对结果进行处理):

(7)释放结果集

格式:int sqlite3_free_table(char**result)

提示:释放sqlite3 _get_table函数所分配的内存。

(8)声明SQL语句

格式:int sqlite3_prepare(

        sqlite3*,

        const char*,

        int sqlite3_stmt**,

        const char**

)

提示:将一条SQL语句编译成字节码留给后面的执行函数,使用该接口访问数据库当前比较的一种方式。

(9)销毁SQL语句

格式:int sqlite3_finalize(sqlite3_stmt*)

提示:销毁将一个准备好的SQL声明,在数据库关闭之前,所有准备好的声明都将被释放销毁。

(10)重置SQL语句

格式:int sqlite3_reset(sqlite3_stmt*)

提示:重置一个SQL声明的状态,使得它可以被再次执行。

(11)实例解释

例子1描述:使用SQLite的API函数实现新建一个数据库student.db,并且在数据库中创建表demo,想表中插入数据,查询插入的数据,最后关闭数据库。

第一步:创建一个.c文件sudo touch sqlite_Demo01.c

打开.c文件编写代码:sudo gedit sqlite_Demo01.c

第一步:打开数据库

//open the database
    sqlite3 *ppdb;
    int ret=sqlite3_open("student.db",&ppdb);
    if(ret!=SQLITE_OK){
        printf("sqlite3_open: %s\n",sqlite3_errmsg(ppdb));
        exit(1);
    }

第二步:创建表

 //create table
    char sql[maxn]={0};
    sprintf(sql,"create table if not exists demo(id integer primary key,name varchar(20));");
    ret=sqlite3_exec(ppdb,sql,NULL,NULL,NULL);
    if(ret!=SQLITE_OK){
        printf("sqlite3_exec_create_table: %s\n",sqlite3_errmsg(ppdb));
        exit(1);
    }
    

第三步:插入数据

 //insert the data
    int id;
    int i;
    char name[32]={0};
    int n;
    printf("please entry the insert number: ");
    scanf("%d",&n);
    
    for(i=0;i<n;i++){
        printf("please entry the id and name\n");
        scanf("%d %s",&id,name);
        //clean the sql
        memset(sql,0,sizeof(sql));
        sprintf(sql,"insert into demo values(%d,'%s');",id,name);
        //exert the sqlite3_exec
        ret=sqlite3_exec(ppdb,sql,NULL,NULL,NULL);
        if(ret!=SQLITE_OK){
            printf("sqlite3_exec_insert_table: %s\n",sqlite3_errmsg(ppdb));
            exit(1);
        }
    }

 第四步:查询数据

//select the table
    memset(sql,0,sizeof(sql));
    sprintf(sql,"select * from demo;");
    ret=sqlite3_exec(ppdb,sql,print,NULL,NULL);
    if(ret!=SQLITE_OK){
        printf("sqlite3_exec_select_table: %s\n",sqlite3_errmsg(ppdb));
        exit(1);
    }

打印输出的回调函数print如下: 

//print function
//the name dedicate id and name
//the value dedicate id=1 and name='tom'......
int print(void*arg,int column,char**value,char**name){
	int i;
	for(i=0;i<column;i++){
		printf("%s = %s  ",name[i],value[i]);
	}
	printf("\n");
	//return 0 represent select successfully
	return 0;		
}

 这里的column表示字段数

value表示每一个字段对应的值;

name对应每一个字段名;

查询方式二:

//the second select method
	char **result;
	int row,column;
	ret=sqlite3_get_table(ppdb,sql,&result,&row,&column,NULL);
	if(ret!=SQLITE_OK){
		printf("sqlite3_exec_select_2_table: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}

	int j;
	int index=column;
	for(i=0;i<row;i++){
		for(j=0;j<column;j++){
			printf("%s = %s  ",result[j],result[index]);
			index++;
		}
		printf("\n");
	}

这里的column指的是字段数;

这里的row表示行数;

数据结果集中排列方式如下: 

最后一步:关闭数据库

//关闭数据库
ret=sqlite3_close(ppdb);
if(ret!=SQLITE_OK){
    printf("sqlite3_exec_close_database: %s\n",sqlite3_errmsg(ppdb));
}

完整代码

#include<stdio.h>
#include<stdlib.h>
#include<sqlite3.h>
#include<string.h>

#define maxn 100

//print function
//the name dedicate id and name
//the value dedicate id=1 and name='tom'......
int print(void*arg,int column,char**value,char**name){
	int i;
	for(i=0;i<column;i++){
		printf("%s = %s",name[i],value[i]);
	}
	printf("\n");
	//return 0 represent select successfully
	return 0;		
}

int main(){
	//open the database
	sqlite3 *ppdb;
	int ret=sqlite3_open("student.db",&ppdb);
	if(ret!=SQLITE_OK){
		printf("sqlite3_open: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}
	//create table
	char sql[maxn]={0};
	sprintf(sql,"create table if not exists demo(id integer primary key,name varchar(20));");
	ret=sqlite3_exec(ppdb,sql,NULL,NULL,NULL);
	if(ret!=SQLITE_OK){
		printf("sqlite3_exec_create_table: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}
	
	//insert the data
	int id;
	int i;
	char name[32]={0};
	int n;
	printf("please entry the insert number: ");
	scanf("%d",&n);
	
	for(i=0;i<n;i++){
		printf("please entry the id and name\n");
		scanf("%d %s",&id,name);
		//clean the sql
		memset(sql,0,sizeof(sql));
		sprintf(sql,"insert into demo values(%d,'%s');",id,name);
		//exert the sqlite3_exec
		ret=sqlite3_exec(ppdb,sql,NULL,NULL,NULL);
		if(ret!=SQLITE_OK){
			printf("sqlite3_exec_insert_table: %s\n",sqlite3_errmsg(ppdb));
			exit(1);
		}
	}
	
	//select the table
	memset(sql,0,sizeof(sql));
	sprintf(sql,"select * from demo;");
	ret=sqlite3_exec(ppdb,sql,print,NULL,NULL);
	if(ret!=SQLITE_OK){
		printf("sqlite3_exec_select_table: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}
	//the second select method
	char **result;
	int row,column;
	ret=sqlite3_get_table(ppdb,sql,&result,&row,&column,NULL);
	if(ret!=SQLITE_OK){
		printf("sqlite3_exec_select_2_table: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}

	int j;
	int index=column;
	for(i=0;i<row;i++){
		for(j=0;j<column;j++){
			printf("%s = %s  ",result[j],result[index]);
			index++;
		}
		printf("\n");
	}
    //关闭数据库
    ret=sqlite3_close(ppdb);
    if(ret!=SQLITE_OK){
        printf("sqlite3_exec_close_database: %s\n",sqlite3_errmsg(ppdb));
    }
	return 0;
}

运行:sudo gcc [源文件.c] -o [可执行文件.o] -lsqlite3

 

例子2:创建一个数据库SQLdatabase数据库,并且创建一个demo表,向表中插入数据并且对插入的数据进行查询,更改和删除,最后关闭数据库。

#include<stdio.h>
#include<stdlib.h>
#include<sqlite3.h>
#include<string.h>


#define maxn 100

int print(void*arg,int column,char**value,char **name){
	int i;
	for(int i=0;i<column;i++){
		printf("%s = %s  \n",name[i],value[i]);
	}
	printf("\n");
	return 0;
}


int main(){
	//open the database
	int i;
	sqlite3*ppdb;
	int ret = sqlite3_open("SQLdatabase.db",&ppdb);
	if(ret!=SQLITE_OK){
		printf("sqlite_error_open: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}	
	//create the table
	char*Errormsg;
	char sql[maxn]={0};
	sprintf(sql,"create table if not exists demo(id integer,name varchar(20),sex integer);");
	ret = sqlite3_exec(ppdb,sql,NULL,NULL,&Errormsg);
	if(ret!=SQLITE_OK){
		printf("sqlite_error_exec_table: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}	
	//insert data into table
	int id,sex;
	char name[30]={0};
	int n;
	printf("please entry the n number: \n");
	scanf("%d",&n);
	
	for(i=0;i<n;i++){
		printf("please entry the id ,name and sex\n");
		scanf("%d %s %d",&id,name,&sex);
		memset(sql,0,sizeof(sql));
		sprintf(sql,"insert into demo values(%d,'%s',%d);",id,name,sex);
		ret=sqlite3_exec(ppdb,sql,NULL,NULL,&Errormsg);
		if(ret!=SQLITE_OK){
			printf("sqlite_error_insert_table: %s\n",sqlite3_errmsg(ppdb));
			exit(1);
		}
	}
	
	//select the data
	//the first method
	memset(sql,0,sizeof(sql));
	sprintf(sql,"select * from demo;");
	ret=sqlite3_exec(ppdb,sql,print,NULL,&Errormsg);
	if(ret!=SQLITE_OK){
		printf("sqlite_error_select_table: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}
	
	//the second method
	int row;
	int column;
	char**result;
	ret=sqlite3_get_table(ppdb,sql,&result,&row,&column,&Errormsg);
	if(ret!=SQLITE_OK){
		printf("sqlite_error_get_table: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}
	int j;
	int index=column;
	for(i=0;i<row;i++){
		for(j=0;j<column;j++){
			printf("%s = %s  ",result[i],result[index]);
			index++;
		}
		printf("\n");
	}
	
	//delete the data	
	memset(sql,0,sizeof(sql));	
	printf("please entry the delete id: ");
	scanf("%d",&id);
	sprintf(sql,"delete from demo where id=%d;",id);
	ret=sqlite3_exec(ppdb,sql,NULL,NULL,&Errormsg);
	if(ret!=SQLITE_OK){
		printf("sqlite_error_delete_data: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}
	//close the database
	ret=sqlite3_close(ppdb);
	if(ret!=SQLITE_OK){
		printf("sqlite_error_close_database: %s\n",sqlite3_errmsg(ppdb));
		exit(1);
	}
	return 0;
}





 

 

(12)关于SQLite几点情况

  • 目前没有可用于SQLite的网络服务器。
  • SQLite只提供数据库级IDE锁定;
  • SQLite没有用户账户概念;
  • SQLite支持多数的SQL92标准,不受支持的一些功能包括完全触发器支持和写视图。
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux下可以使用命令行工具sqlite3来操作SQLite数据库SQLite是一种轻量级的关系型数据库,它的数据存储在单个文件中,非常适合小型项目或嵌入式设备。 要使用sqlite3,首先需要安装它。在Ubuntu或Debian系统中,可以使用以下命令安装: sudo apt-get install sqlite3 安装完成后,可以使用以下命令打开一个SQLite数据库文件: sqlite3 /path/to/database/file.db 在sqlite3命令行中,可以执行SQL语句来创建表、插入数据、查询数据等操作。例如,创建一个名为“users”的表: CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER ); 插入一条数据: INSERT INTO users (name, age) VALUES ('Tom', 25); 查询数据: SELECT * FROM users; 更多操作可以参考SQLite官方文档。 ### 回答2: SQLite3是一种内嵌式的关系型数据库,它拥有小巧灵活、可移植性强的特点,并且在很多平台上都可以使用。常见的Linux操作系统中一般会自带SQLite3,因此我们可以利用这一点轻松地在 Linux 系统中使用 SQLite3 数据库。 首先我们需要在命令行界面下打开 SQLite 命令行工具,这可以通过在终端中输入 sqlite3 命令实现。此时会进入 SQLite3 的 shell 窗口,在这个窗口中,我们可以输入 SQL 语句和 SQLite 提供的命令来操作数据库。 接下来,我们可以创建一个新的数据库文件。可以使用如下命令创建数据库: ``` sqlite3 database.db ``` 这个命令将会在当前目录下创建一个名为 database.db 的 SQLite3 数据库文件。如果指定的文件已经存在,这个命令会直接打开这个数据库文件。 接着,我们可以使用 SQLite3 的语言来执行数据库操作,例如我们可以使用如下命令创建一个名为 users 的表格: ``` CREATE TABLE users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, age INTEGER NOT NULL ); ``` 在这个命令中,我们首先指定了表的名称为 users,并用括号包含了我们想要存储的每一个字段。我们定义了三个字段,分别是 id、name 和 age。其中,id 字段被定义为 PRIMARY KEY,这意味着它将作为这个表格的主键,确保每一行数据都具备唯一性。而 name 和 age 字段则分别被定义为 TEXT 和 INTEGER 类型,并且我们也为它们定义了 NOT NULL 属性,禁止这两个字段为空值。 我们可以使用 INSERT INTO 语句向 users 表格中添加数据: ``` INSERT INTO users (name, age) VALUES ("Tom", 20); ``` 在这个例子中,我们向 users 表格中添加了一行数据,字段 name 的值为 "Tom",age 的值为 20。我们没有指定 id 字段,因为它是自动生成的。若果我们需要查看 users 表格中的所有数据,可以使用 SELECT * FROM users 命令。 总的来说,SQLite3 是一个功能强大而且简单易用的数据库系统,并且它适用于多种不同的平台。在 Linux 操作系统上,SQLite3 是一个非常好的选择,因为它可以帮助我们轻松地管理和操作一些小型的数据。它还可以通过 Python 和其他语言的 API 来非常简单地实现许多数据操作任务。 ### 回答3: Linux使用SQLite3数据库是一种比较流行的数据库运用方式,因为SQLite3是一款轻量级的、开源的数据库,数据存储在单一文件中,所以在单个用户下使用SQLite3是非常方便的。 SQLite3的安装过程很简单,只需要通过apt-get命令进行安装即可。在安装完成后,就可以在linux服务器中使用sqlite3命令行进行数据库的管理。 SQLite3的使用可以分为以下几个步骤: 1. 创建数据库 使用sqlite3数据库之前,需要先创建一个数据库文件,可以使用如下的命令创建: $ sqlite3 test.db 2. 创建数据表 使用CREATE TABLE语句可以在数据库中创建数据表,例如: CREATE TABLE users ( id INT PRIMARY KEY, name TEXT, age INT ); 3. 插入数据 插入数据可以使用INSERT INTO语句,例如: INSERT INTO users(id, name, age) VALUES (1, 'Tom', 20); 4. 查询数据 可以使用SELECT语句查询数据,例如: SELECT * FROM users; 5. 更新数据 使用UPDATE语句可以更新数据,例如: UPDATE users SET age = 21 WHERE id = 1; 6. 删除数据 使用DELETE语句可以删除数据,例如: DELETE FROM users WHERE id = 1; SQLite3在使用过程中有许多的优点,比如轻量级、文件型数据库、高性能等等。不过也有些缺点,比如不支持并发访问、不支持存储过程等。所以,如何选择数据库还需要结合具体应用场景来进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值