技术标签: sqlite linux下的应用编程 数据库
阅读引言: 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例, 相信仔细学习完这篇内容之后大家一定能有所收获。
目录
数据(Data):能够输入计算机并能被计算机程序识别和处理的信息集合
数据库 (Database):数据库是在数据库管理系统管理和控制之下,存放在存储介质上的数据集合
大型数据库:
Oracle公司是最早开发关系数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率名列前茅。
IBM 的DB2是第一个具备网上功能的多媒体关系数据库管理系统,支持包Linux在内的一系列平台。
中型数据库:
Server是微软开发的数据库产品,主要支持windows平台。
小型数据库:
mySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,2008年被Sun公司收购,开放源码。
基于嵌入式Linux的数据库主要有SQLite, Firebird, Berkeley DB, eXtremeDBFirebird是关系型数据库,功能强大,支持存储过程、SQL兼容等SQLite关系型数据库,体积小,支持ACID事务
Berkeley DB中并没有数据库服务器的概念,它的程序库直接链接到应用程序中eXtremeDB是内存数据库,运行效率高
SQLite的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。 他是一个轻量级的嵌入式数据库。
SQLite有以下特性:
- 零配置无需安装和管理配置;
- 储存在单一磁盘文件中的一个完整的数据库;
- 数据库文件可以在不同字节顺序的机器间自由共享;
- 支持数据库大小至2TB;
- 足够小,全部源码大致3万行c代码,250KB;
- 比目前流行的大多数数据库对数据的操作要快;
手工创建:
使用SQLite3工具,通过手工输入SQL命令行完成数据库创建,用户在Linux的命令行界面中输入SQLite3可启动SQLite3工具
代码创建:
在代码中常动态创建数据库,在程序运行过程中,当需要进行数据库操作时,应用程序会首先尝试打开数据库,此时如果数据库并不存在,程序则会自动建立数据库,然后再打开数据库
数据库的相关术语有很多,以下是一些常见的数据库术语:
1. 数据库(Database):数据的集合,按照一定的数据模型组织和存储的集合。
2. 表(Table):用于存储数据的二维数据结构,由行(Record)和列(Field)组成。
3. 行(Record):表中的一条数据,也被称为记录或元组。
4. 列(Field):表中的一个属性,也被称为字段或列名。
5. 主键(Primary Key):表中用于唯一标识每条记录的字段或字段组合。
6. 外键(Foreign Key):表中用于建立与其他表之间关联关系的字段。
7. 索引(Index):加速数据检索的数据结构,通过对关键字段建立索引,可以快速定位数据。
8. 查询(Query):从数据库中检索数据的操作,通过使用SQL语言编写查询语句来实现。 9. SQL(Structured Query Language):结构化查询语言,用于管理和操作关系型数据库的标准语言。
10. 视图(View):虚拟表,基于一个或多个表的查询结果创建的,可以简化复杂的查询操作。
11. 触发器(Trigger):与表相关联的特殊类型的存储过程,在插入、更新或删除数据时自动触发执行。
12. 事务(Transaction):一组数据库操作,要么全部执行成功,要么全部回滚,保证数据的一致性和完整性。
13. 归范式(Normalization):为了避免数据冗余和不一致,对数据模型进行优化的过程。常见的归范式有第一范式(1NF)、第二范式(2NF)和第三范式(3NF)等。
14. 关系数据库管理系统(RDBMS):用于存储、管理和操作关系型数据库的软件系统,例如MySQL、Oracle、SQL Server等。 这些术语是数据库领域中常用的,理解这些术语可以帮助你更好地了解和使用数据库。
15.数据库管理者(database administrator)
sudo apt-get install
dpkg -s sqlite3
按道理来讲, 到这一步就结束了, 但是在实际的代码编译中, 找不到sqlite3.h头文件, 也链接不到对应的sql接口的实现。大家安装完可以先去/usr/include目录下看有没有对应的头文件, 没有的话这样干。安装sqlite3的库包。
sudo apt-get install libsqlite3-dev
注意都以'.'开头
.exit 退出
.quit 退出
.table 查看表
.schema 查看表的结构
.open databasename 打开数据库
.help 命令帮助
简单演示
1-- 创建一张表
create table stuinfo(id integer, name text, age integer, score float);
2-- 插入一条记录
insert into stuinfo values(1001, 'zhangsan', 18, 80);
insert into stuinfo (id, name, score) values(1002, 'lisi', 90);
3-- 查看数据库记录
select * from stuinfo;
select * from stuinfo where score = 80;
select * from stuinfo where score = 80 and name= 'zhangsan';
select * from stuinfo where score = 80 or name='wangwu';
select name,score from stuinfo; 查询指定的字段
select * from stuinfo where score >= 85 and score < 90;
4-- 删除一条记录
delete from stuinfo where id=1003 and name='zhangsan';
5-- 更新一条记录
update stuinfo set age=20 where id=1003;
update stuinfo set age=30, score = 82 where id=1003;
6-- 删除一张表
drop table stuinfo;
7-- 增加一列
alter table stuinfo add column sex char;
8-- 删除一列
create table stu as select id, name, score from stuinfo; 复制除了要删除的那一列,
drop table stuinfo; //删除原来的表
alter table stu rename to stuinfo; //把新建的表改为原来的表名
设置主键并且该主键是自增的, 主键的意思就是唯一的意思, 比如一张表中的id号, 身份证号啥的。
create table info(id integer primary key autoincrement, name vchar);
简单演示
- int sqlite3_open(char *path, sqlite3 **db);
- 功能:打开sqlite数据库
- path:数据库文件路径
- db:指向sqlite句柄的指针
- 返回值:成功返回0,失败返回错误码(非零值)
- int sqlite3_close(sqlite3 *db);
- 功能:关闭sqlite数据库
- 返回值:成功返回0,失败返回错误码
- const char *sqlite3_errmg(sqlite3 *db);
- 返回值:返回错误信息
- Int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);
- 功能:执行SQL操作
- db:数据库句柄
- sql:SQL语句
- callback:回调函数
- errmsg:错误信息指针的地址
- 返回值:成功返回0,失败返回错误码
- typedef int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
- 功能:每找到一条记录自动执行一次回调函数
- para:传递给回调函数的参数
- f_num:记录中包含的字段数目
- f_value:包含每个字段值的指针数组
- f_name:包含每个字段名称的指针数组
- 返回值:成功返回0,失败返回-1
- 不使用回调函数执行SQL语句
- int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);
- 功能:执行SQL操作
- db:数据库句柄
- sql:SQL语句
- resultp:用来指向sql执行结果的指针
- nrow:满足条件的记录的数目
- ncolumn:每条记录包含的字段数目
- errmsg:错误信息指针的地址
- 返回值:成功返回0,失败返回错误码
实例软件结构如下:
Makefile
OBJ=$(wildcard ./*.c)
all:$(OBJ)
gcc *.c -o test -lsqlite3
main.c
#include "sqlite_method.h"
/* hint user input */
void hint_display();
/* main */
int main(int argc, const char *argv[])
{
sqlite3 *db;
char *errmsg;
char input;
if(sqlite3_open(DATABASE_PATH, &db) != SQLITE_OK) {
printf("%s\n", sqlite3_errmsg(db));
return -1;
} else {
printf("open database [%s] success\n", DATABASE_PATH);
}
if(sqlite3_exec(db, "create table if not exists exercise(id integer, name text, score integer);", \
NULL, NULL, &errmsg) != SQLITE_OK) {
printf("sqlite3_exec failed, line: %d\n", __LINE__);
}
/* handle user input */
while(1) {
hint_display();
scanf("%c", &input);
switch(input) {
case 'i':
insert_handle(db);
getchar();
break;
case 'd':
delete_handle(db);
getchar();
break;
case 'q':
query_handle(db);
getchar();
break;
case 'u':
update_handle(db);
getchar();
break;
case '!':
quit_handle(db);
getchar();
break;
default:
printf("invalid option!\n");
}
}
return 0;
}
void hint_display()
{
printf("**********************************************************\n");
printf("*i: insert d: delete q: query u: update !:exit*\n");
printf("**********************************************************\n");
}
sqlite_method.h
#ifndef _SQLITE_METHOD_H_
#define _SQLITE_METHOD_H_
/*Author: Hewei
*Date: 2024-3-30
*Brife: database operator
* */
#include <sqlite3.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define DATABASE_PATH "./exercise.db"
#define N 256
void insert_handle(sqlite3 *db);
void delete_handle(sqlite3 *db);
void query_handle(sqlite3 *db);
void update_handle(sqlite3 *db);
void quit_handle(sqlite3 *db);
#endif
sqlite_method.c
#include "sqlite_method.h"
void insert_handle(sqlite3 *db)
{
int id;
char name[128] ={0};
int score;
char buff[N] = {0};
char *errmsg;
printf("Please input id:");
scanf("%d", &id);
printf("Please input name:");
scanf("%s", name);
//getchar(); method 1
printf("Please input score:");
//scanf("% c%d", &score); method 2
scanf("%*c%d", &score);
sprintf(buff, "insert into exercise values(%d, '%s', %d)", id, name, score);
if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {
printf("%s\n", errmsg);
} else {
printf("\n\n\n");
printf("insert operator success!|\n");
}
}
void delete_handle(sqlite3 *db)
{
int id;
char buff[N] = {0};
char *errmsg;
printf("Please input delete id:");
scanf("%d", &id);
snprintf(buff, sizeof(buff), "delete from exercise where id = %d", id);
if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {
printf("%s\n", errmsg);
} else {
printf("\n\n\n");
printf("delete operator success!|\n");
}
}
int query_callback(void *arg, int f_num, char **value, char **name)
{
int i;
static int count = 0;
if(count == 0) {
for(i = 0; i < f_num; i++) {
printf("%-10s", name[i]);
}
count = 1;
putchar(10);
}
for(i = 0; i < f_num; i++) {
printf("%-10s", value[i]);
}
puts("");
return 0;
}
void query_handle(sqlite3 *db)
{
char buff[N] = {0};
char *errmsg;
sprintf(buff, "select * from exercise");
if(sqlite3_exec(db, buff, query_callback, NULL, &errmsg) != SQLITE_OK) {
printf("%s\n", errmsg);
} else {
printf("\n\n\n");
printf("query operator success!|\n");
}
}
void update_handle(sqlite3 *db)
{
char buff[128];
char *errmsg;
int id, score;
printf("Please input you want update id:");
scanf("%d", &id);
printf("Please input you want update score:");
scanf("%d", &score);
sprintf(buff, "update exercise set score = %d where id = %d\n", score, id);
if(sqlite3_exec(db, buff, NULL, NULL, &errmsg) != SQLITE_OK) {
printf("%s\n", errmsg);
} else {
printf("\n\n\n");
printf("update operator success!\n");
}
}
void quit_handle(sqlite3 *db)
{
printf("\n\n\n");
printf("database os exit success!\n");
sqlite3_close(db);
exit(1);
}
1. 关系型数据库其实就是execl那种类似的表格, 不是什么高深的东西
2. Sqlite3的特点: 体积小、简单、高效、本地存储、源码开放。
好了, 老规矩希望对有需要的人有帮助。因为这个我实现得不是很规范,看不懂的地方随时欢迎私信。
在多媒体通信领域,MRCP(Media Resource Control Protocol)协议被广泛用于控制语音识别和合成等媒体资源。UniMRCP是一个开源的MRCP实现,提供了客户端和服务端的库。UmcFramework是一个基于UniMRCP客户端库的示例应用程序框架,它帮助开发者快速集成和测试MRCP客户端功能。本文将详细介绍如何使用UmcFramework和unimrcpclient.xml配置文件连接到多个SIP设置,以及如何用C代码进行示例说明。
文章浏览阅读3k次。报错:java.net.ProtocolException: Server redirected too many times (20)1.没有检查到cookie,一直循环重定向。解决:CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL));URL url = new URL(url); ..._java.net.protocolexception: server redirected too many times (20)
文章浏览阅读4.1k次。问题这是部分报错信息2019-07-11 14:03:34.283 WARN [restartedMain][DirectJDKLog.java:175] - Failed to scan [file:/D:/repo/org/apache/derby/derby/10.14.2.0/derbyLocale_ja_JP.jar] from classloader hierarchyjava...._failed to scan from classloader hierarchy
文章浏览阅读2.8k次,点赞3次,收藏7次。在MATLAB中,ones函数用于创建一个指定大小的由1组成的矩阵或数组。_matlab中ones函数
文章浏览阅读3.9w次,点赞2次,收藏9次。 在使用电脑办公过程中,安装应用程序时难免遇到无法安装或者无法正常启动的问题,这对我们使用电脑带来了诸多不便。那遇到应用程序无法正常启动的问题要如何解决呢?相信大家肯定都是十分疑问的,每次都是只能忍痛重新安装软件。今天,小编就和大家探讨下应用程序无法正常启动的解决方法,帮助大家排忧解难。0xc000007b电脑图解1 第一种方案:SFC检查系统完整性来尝试修复丢失文件 1、打开电脑搜索输入cmd.exe,选择以管理员身份运行,跳出提示框时选择继续。0xc000007b电脑图解2_photoshop应用程序无法正常启动0xc000007b。请单击“确认”关闭应用程序。
文章浏览阅读396次。1、概念 REDO LOG是Oracle为确保已经提交的事务不会丢失而建立的一个机制。实际上REDO LOG的存在是为两种场景准备的:实例恢复(INSTANCE RECOVERY);介质恢复(MEDIA RECOVERY)。 实例恢复的目的是在数据库发生故障时,确保BUFFER CACHE中的数据不会丢失,不会造成数据库的..._oracle 实例恢复和介质恢复
文章浏览阅读418次。概述说明CAS内置了密码找回和密码修改的功能; 密码找回功能是,系统会吧密码重置的连接通过邮件或短信方式发送给用户,用户点击链接后就可以重置密码,cas还支持预留密码重置的问题,只有回答对了,才可以重置密码;系统可配置密码重置后,是否自动登录; 密码修改功能是,用户登录后输入新密码即可完成密码修改。安装步骤`1. 首先,搭建好cas sso server您需要按..._修改cas默认用户密码
文章浏览阅读141次。之前几章演示的熔断,降级 都是 RestTemplate + Ribbon 和RestTemplate + Hystrix ,但是在实际开发并不是这样,实际开发中都是 Feign 远程接口调用。Feign + Hystrix 演示: eruka(略)order 服务工程: pom.xml<?xml version="1.0" encoding="U..._this is order 服务工程
文章浏览阅读3.4k次,点赞35次,收藏43次。学习率是影响目标检测精度和速度的重要因素之一。合适的学习率调度策略可以加速模型的收敛和提高模型的精度。在YOLOv7算法中,可以使用基于余弦函数的学习率调度策略(Cosine Annealing Learning Rate Schedule)来调整学习率。
文章浏览阅读4k次,点赞4次,收藏9次。 linux中进程退出函数:exit()和_exit()的区别(1)_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核。(2)调用_exit函数时,其会关闭进程所有的文件描述符,清理内存以及其他一些内核清理函数,但不会刷新流(stdin, stdout, stderr ...). exit函数是在_exit..._linux结束进程可以用哪些函数,它们之间有何区别?
文章浏览阅读134次。select 5000/10000.0 --想变成0.5select 5500/10000.0 --想变成0.55select 5550/10000.0 --想变成0.555select 5555/10000.0 --想变成0.5555其结果分别为:0.5000000 0.5500000 0.5550000 0.5555000一、如果想去掉数字5后面多余的0 ,需要转化一下:selec..._sql server 去小数 0
文章浏览阅读3.1k次。例一:import { Injectable } from '@angular/core';import { Observable } from 'rxjs';import { User } from "./model/User";import { map } from 'rxjs/operators';import { Http, Response, Headers, RequestOp..._angular6,requestoptions改成了什么