網(wǎng)站做好了 怎么做解析建網(wǎng)站的軟件有哪些
【六】嵌入式SQLite數(shù)據(jù)庫
文章目錄
- 【六】嵌入式SQLite數(shù)據(jù)庫
- 1.簡介
- 2.SQLite數(shù)據(jù)庫安裝
- 3.SQLite命令用法
- 1.創(chuàng)建數(shù)據(jù)庫
- 2.創(chuàng)建和查看表格
- 3.插入查看數(shù)據(jù)(記錄)
- 4.刪除更改數(shù)據(jù)(記錄)
- 4.SQLite編程操作
- 1.打開/創(chuàng)建數(shù)據(jù)庫的C接口
- 2.創(chuàng)建表并插入數(shù)據(jù)的C接口
- 3.SELECT操作
- 4.UPDATE操作
- 5.DELETE操作
1.簡介
輕量化,易用的嵌入式數(shù)據(jù)庫,用于設(shè)備端的數(shù)據(jù)管理,可以理解成單點的數(shù)據(jù)庫。傳統(tǒng)服務(wù)器型數(shù)據(jù)庫用于管理多端設(shè)備,更加復(fù)雜
SQLite是一個無服務(wù)器的數(shù)據(jù)庫,是自包含的。這也稱為嵌入式數(shù)據(jù)庫,這意味著數(shù)據(jù)庫引擎作為應(yīng)用程序的一部分運行。
MySQL需要運行服務(wù)器,MySQL將需要客戶端和服務(wù)器架構(gòu)通過網(wǎng)絡(luò)進行交互。
SQLite的優(yōu)點 | SQLite的缺點 | MySQL的優(yōu)點 | MySQL的缺點 |
---|---|---|---|
基于文件,易于設(shè)置和使用 適合基礎(chǔ)開發(fā)和測試 輕松攜帶 使用標準SQL語法進 行微小更改 使用方便 | 缺乏用戶管理和安全功能 不容易擴展 不適合大數(shù)據(jù)庫 無法定制 | 使用方便 提供了許多與數(shù)據(jù)庫相關(guān)的功能 良好的安全功能 易于擴展,適用于大型數(shù)據(jù)庫 提供良好的速度和性能 提供良好的用戶管理和多種訪問控制 | 需要一些技術(shù)專業(yè)知識來設(shè)置 與傳統(tǒng)SQL相比,語法略有不同 |
基于嵌入式的數(shù)據(jù)庫主要有:SQLite,Firebird,Berkeley DB,eXtremeDB
- Firebird 是關(guān)系型數(shù)據(jù)庫,功能強大,支持存儲過程,SQL兼容等
- SQLite 關(guān)系型數(shù)據(jù)庫,體積小,支持ACID事務(wù)
- Berkeley DB 并沒有數(shù)據(jù)庫服務(wù)器的概念,他的程序直接鏈接到應(yīng)用程序中
- eXtremeDB 是內(nèi)存數(shù)據(jù)庫,運行效率高
2.SQLite數(shù)據(jù)庫安裝
安裝方式一:
這個安裝的版本是2
sudo apt-get -y install sqlite
安裝方式二:
總括:
- 把下載的文件
sqlite-autoconf-3450300.tar.gz
上傳到開發(fā)板 - 解壓:
tar xvf sqlite-autoconf-3450300.tar.gz
cd sqlite-autoconf-3450300
進入文件夾./configure --prefix=/usr/local
配置安裝路徑在/usr/local
make
編譯(比較久10分鐘)sudo make install
安裝
詳細過程
1.下載網(wǎng)址:
https://www.sqlite.org/download.html
下載sqlite3軟件包(每一階段的版本會不一樣,一直在更新)
2.將下載好的壓縮包上傳到開發(fā)板
3.解壓:tar xvf sqlite-autoconf-3450300.tar.gz
4.開始配置編譯
cd sqlite-autoconf-3450300 //進入文件夾
./configure --prefix=/usr/local //配置安裝路徑在/usr/local
make //開始編譯,時間很久,10分鐘左右
sudo make install//安裝
在主頁面打入sqlite3
進入數(shù)據(jù)庫
3.SQLite命令用法
里面的很多命令背會就行,會用會改,沒有什么道理可言。
這里只講最基礎(chǔ)的用法,詳細的可以看https://www.runoob.com/sqlite/sqlite-tutorial.html
在正式開始之前建議先建一個名為sqlite的文件夾,方便后續(xù)的項目管理
mkdir sqlite //創(chuàng)建名為sqlite的文件夾
cd sqlite //進入名為sqlite的文件夾
1.創(chuàng)建數(shù)據(jù)庫
一個數(shù)據(jù)庫可以創(chuàng)建多個表格,每個表格又可以創(chuàng)建多個數(shù)據(jù)
剛進入數(shù)據(jù)庫就會給我們提示創(chuàng)建數(shù)據(jù)庫的方法
熱知識:
.db 文件通常是指 SQLite 數(shù)據(jù)庫文件。SQLite 是一種輕量級的數(shù)據(jù)庫引擎,常用于移動應(yīng)用程序和小型桌面應(yīng)用程序中存儲數(shù)據(jù)。這些文件包含了結(jié)構(gòu)化的數(shù)據(jù),可以通過 SQLite 數(shù)據(jù)庫管理工具或編程語言中的 SQLite 庫進行訪問和操作。
創(chuàng)建方式一:進入數(shù)據(jù)庫后創(chuàng)建
sqlite3 //進入數(shù)據(jù)庫
.open test.db //創(chuàng)建名為test.db 的數(shù)據(jù)庫(有的話直接打開,沒有直接創(chuàng)建)
.quit //退出
數(shù)據(jù)庫退出后在命令當(dāng)前路徑創(chuàng)建數(shù)據(jù)庫test.db
創(chuàng)建方式二:在進入數(shù)據(jù)庫時直接創(chuàng)建
sqlite3 test.db //在命令運行當(dāng)前窗口創(chuàng)建數(shù)據(jù)庫test.db//在數(shù)據(jù)庫命令下
.databases 列出當(dāng)前打開的數(shù)據(jù)庫
.quit 退出
2.創(chuàng)建和查看表格
思考一下我們以前的結(jié)構(gòu)體,其實就很像一個列表。
不過在sqlite數(shù)據(jù)庫里面,int=Inteager
struct stu{int id;char name;int score;
}
2.1在sqlite數(shù)據(jù)庫下的操作:
2.1.1創(chuàng)建表格:
//創(chuàng)建一個名為stu1 的表格
create table stu1(id Integer,name char,score Integer);
create table stu(id Integer,name char,score Integer);
2.1.2查看有哪些表格:
.tables
3.插入查看數(shù)據(jù)(記錄)
以下命令均在數(shù)據(jù)庫命令行中操作
3.1插入數(shù)據(jù):
insert into stu values(18130106,'huang',99);// 必須是單引號'',高版本的sqlite3已經(jīng)不支持雙引號""
insert into stu values(22222226,'ming',59);
insert into stu2(name,score) values('huanggang',98); //插入部分字段內(nèi)容
3.2查看數(shù)據(jù)
select * from stu; //查詢stu所有字段的結(jié)果
select name,score from stu; //查詢stu數(shù)據(jù)庫中部分字段的內(nèi)容
4.刪除更改數(shù)據(jù)(記錄)
以下命令均在數(shù)據(jù)庫命令行中操作
4.1刪除表
drop table stu;
4.2刪除一條數(shù)據(jù)
delete from stu where id = 18130101;
4.3更改一條數(shù)據(jù)
// 要改的表 改什么 匹配的信息
update stu set name = 'huangg' where id = 18130106;
4.4增加一列
alter table stu add column sex char;
4.SQLite編程操作
注意:文中所講版本為sqlite3,版本過低的請自行更新。
1.打開/創(chuàng)建數(shù)據(jù)庫的C接口
下面的 C 代碼段顯示了如何連接到一個現(xiàn)有的數(shù)據(jù)庫。
如果數(shù)據(jù)庫不存在,那么它就會被創(chuàng)建,最后將返回一個數(shù)據(jù)庫對象。
用到的函數(shù)介紹:
1.1 sqlite3_open:打開一個數(shù)據(jù)庫對象;
//1.頭文件
#include <sqlite3.h>
//2.函數(shù)原型
int sqlite3_open(const char *filename, sqlite3 **ppDb);filename:要打開的sqlite3數(shù)據(jù)庫的路徑名ppDb: 二級指針,用來保存打開的數(shù)據(jù)庫的連接對象。//3.返回值
成功返回SQLITE_OK,失敗返回其他值。
返回值所對應(yīng)的宏:
1.2 sqlite3_close:關(guān)閉數(shù)據(jù)庫連接對象
//1.頭文件
#include <sqlite3.h>
//2.函數(shù)原型
int sqlite3_close(sqlite3*);在使用此函數(shù)之前要先調(diào)用 sqlite3_open(); 打開的數(shù)據(jù)庫連接。//3.返回值
所有與連接相關(guān)的語句都應(yīng)在連接關(guān)閉之前完成。
如果還有查詢沒有完成,將返回SQLITE_BUSY 禁止關(guān)閉的錯誤消息。
1.3用于查看錯誤代碼信息:
const char *sqlite3_errmsg(sqlite3*);
1.4常用來獲取最近調(diào)用的API接口返回的錯誤代碼(是錯誤代碼數(shù)字)
sqlite3_errcode(sqlite3*) ;
代碼示例:
編譯:gcc a.c -lsqlite3
鏈接到庫
運行:./a.out test.db
鏈接到已有的數(shù)據(jù)庫(如果沒有會創(chuàng)建一個)
//a.c
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>int main(int argc,char **argv)
{sqlite3 *db = NULL;int ret = 0;if(argc<2){printf("Uage: %s xxx.db\n",argv[0]);exit(-1);}if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){ //打開或創(chuàng)建一個數(shù)據(jù)庫對象 成功返回SQLITE_OK 0printf("ret = %d create %s ok\n",ret,argv[1]);//打印返回的數(shù)值}else{printf("ret = %d creat %s fail\n",ret,argv[1]);//打印返回錯誤碼的數(shù)值printf("error num = %d error mesg:%s\n",sqlite3_errcode(db),sqlite3_errmsg(db));//獲取最近調(diào)用的API接口返回的錯誤代碼 and 錯誤信息輸出if(ret==14){//錯誤碼判斷printf("permisson deny\n");}exit(-1);}sqlite3_close(db);return 0;
}
2.創(chuàng)建表并插入數(shù)據(jù)的C接口
用到的函數(shù)介紹:
sqlite3_exec:該例程提供了一個執(zhí)行 SQL 命令的快捷方式,SQL 命令由 sql 參數(shù)提供,可以由多個 SQL 命令組成。
//1.頭文件
#include <sqlite3.h>
//2.函數(shù)原型
int sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void *data, char **errmsg );
//3.參數(shù)說明
sqlite3* : open 打開的數(shù)據(jù)庫的描述符
const char* sql, : 執(zhí)行的sql功能語句(可以很多語句)
*callback, : sql語句對應(yīng)的回調(diào)函數(shù)
void* data, : 傳遞給回調(diào)函數(shù)的指針參數(shù)
char **errmsq : 錯誤信息
int (*callback):回調(diào)函數(shù)
//1.函數(shù)原型
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
//2.參數(shù)說明
*arg :是sqlite3_exec函數(shù)的第四個參數(shù)data
column_size :數(shù)據(jù)庫的字段數(shù)(就是name sec num 這些類型有幾個)
column_value[] :列的值(就是對應(yīng)的name sec score 對應(yīng)的值)
column_name :字段名字(就是name sec score的這些名字)
//3.返回值
必須會返回0 //這樣才能數(shù)據(jù)庫中有幾條數(shù)據(jù)回調(diào)函數(shù)就會被調(diào)用幾次。
回調(diào)函數(shù):會先執(zhí)行*sql對應(yīng)的功能命令,然后將結(jié)果傳遞給回調(diào)函數(shù)
代碼示例1:
功能描述:查看數(shù)據(jù)庫表中的數(shù)據(jù)。
必須從頭到尾讀一遍,讀懂讀會
//b.c
#include <stdio.h>
#include <sqlite3.h>
int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{int i;printf("arg=%s\n",(char *)arg);//這個值來自于sqlite3_exec第三個參數(shù)for(i=0;i<column_size;i++){printf("%s = %s\n", column_name[i], column_value[i]);//行名與行值}printf("=======================\n");return 0;//必須返回0,這樣數(shù)據(jù)庫中有多少條數(shù)據(jù),這個回調(diào)函數(shù)就會被調(diào)用多少次
}int main(char argc, char **argv)
{sqlite3 *db;//可以理解為數(shù)據(jù)庫編號,加入打開test.db,那么他有一個類似于文件的描述符,身份證char *errorMes = NULL;//用來存sqlite3_exec第五個參數(shù)的錯誤信息int ret;if(argc < 2){printf("Usage: %s xxx.db\n",argv[0]);return -1;}if( (ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){printf("open %s success\n",argv[1]);//數(shù)據(jù)庫打開成功}else{//打印錯誤信息和錯誤碼printf("error num = %d error mesg:%s\n",sqlite3_errcode(db),sqlite3_errmsg(db));//printf("error num = %d error mesg:%s\n",ret ,sqlite3_errmsg(db)); 與上面同一個意思if(ret == 14){printf("permission den\n");//禁止訪問的意思}return -1;}//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)//errorMes may sigment error!sqlite3_exec(db, "select * from stu;",callback, "from SQL sqlite3_exec:",&errorMes);sqlite3_close(db);printf("done\n");return 0;
}
sqlite3數(shù)據(jù)庫test.db
中的信息:
換成代碼體現(xiàn):
1.編譯:gcc b.c -lsqlite3
2.運行:./a.out test.db
代碼示例2:
功能描述:實現(xiàn)一條建立表格并且插入數(shù)據(jù)的指令
//c.c
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>static int callback(void *arg, int column_size, char *column_value[], char*column_name[])
{int i;printf("arg = %s\n",(char *)arg);for(i=0;i<column_size;i++){printf("%s = %s\n",column_name[i],(char *)column_value[i]);}printf("========================\n");return 0 ;// 數(shù)據(jù)庫中有幾條數(shù)據(jù)它回調(diào)函數(shù)就會調(diào)用幾次
}
int main(int argc,char **argv)
{sqlite3 *db = NULL;int ret = 0;char *errmsg;char *sql;
//1.參數(shù)出錯報錯if(argc<2){printf("Uage: %s xxx.db\n",argv[0]);exit(-1);}
//2.打開數(shù)據(jù)庫if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){printf("ret = %d create %s success\n",ret,argv[1]);}else{printf("ret = %d creat %s fail\n",ret,argv[1]);printf("error num = %d error mesg:%s\n",sqlite3_errcode(db),sqlite3_errmsg(db));if(ret==14){printf("permisson deny\n");}exit(-1);}/* Create SQL statement */sql = "create table class1(id Integer,name char,score Integer);" \"insert into class1 values(211,'sun',99);" \"select * from class1;";/* Execute SQL statement */ret = sqlite3_exec(db,sql,callback,"into callback",&errmsg);if( ret != SQLITE_OK ){// printf("ret = %d error message %s\n",ret,errmsg);fprintf(stderr, "SQL error: %s\n", errmsg);sqlite3_free(errmsg);}else{fprintf(stdout, "Records created successfully\n");}printf("Done\n");sqlite3_close(db);return 0;
}
結(jié)果:
1.編譯:gcc c.c -lsqlite3
2.運行:./a.out a.db
3.SELECT操作
下面的 C 代碼段顯示了如何從前面創(chuàng)建的class1
表中獲取并顯示記錄:
以下操作其實在上文已經(jīng)體現(xiàn)出來,下面的操作了解即可。
//test1.c
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>static int callback(void *arg, int column_size, char *column_value[], char*column_name[])
{int i ;printf("%s\n",(char *)arg);for(i = 0;i<column_size;i++){printf("%s = %s\n",column_name[i],column_value[i]);}printf("=================================\n");return 0 ;//必須返回0,這樣數(shù)據(jù)庫中有多少條數(shù)據(jù),這個回調(diào)函數(shù)就會被調(diào)用多少次
}int main(int argc,char **argv)
{sqlite3 *db;int ret;char *sql = NULL;char *errmsg = NULL;if(argc<2){printf("Uage: %s xxx.db\n",argv[0]);exit(-1);}if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK ){printf("ret = %d ,open %s success \n",ret,argv[1]);}else{printf("ret = %d,error messsge:%s \n",sqlite3_errcode(db),sqlite3_errmsg(db));exit(-1);}sql = "select * from class1";ret = sqlite3_exec(db,sql,callback,"into callback",&errmsg);printf("ret = %d,error messsge:%s \n",ret,errmsg);sqlite3_close(db);return 0 ;
}
4.UPDATE操作
下面的 C 代碼段顯示了如何使用 UPDATE 語句來更新任何記錄,然后從class1
表中獲取并顯示更新的記錄:
update class1 set name = 'lihua' where id = 211;
代碼:
//test2.c
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>int callback(void *arg, int column_size, char *column_value[], char*column_name[])
{int i ;printf("%s\n",(char *)arg);for(i = 0;i<column_size;i++){printf("%s = %s\n",column_name[i],column_value[i]);}printf("=================================\n");return 0 ;//必須返回0,這樣數(shù)據(jù)庫中有多少條數(shù)據(jù),這個回調(diào)函數(shù)就會被調(diào)用多少次
}int main(int argc,char **argv)
{sqlite3 *db;int ret;char *sql = NULL;char *errmsg = NULL;if(argc<2){printf("Uage: %s xxx.db\n",argv[0]);exit(-1);}if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK ){printf("ret = %d ,open %s success \n",ret,argv[1]);}else{printf("ret = %d,error messsge:%s \n",sqlite3_errcode(db),sqlite3_errmsg(db));exit(-1);}
/*******************************先查看class1表里面有什么數(shù)據(jù)調(diào)用update 更新一條數(shù)據(jù)再次查看class1表里面的數(shù)據(jù)
********************************/sql = "select * from class1;" \"update class1 set name = '李明' where id = 211;"\"select * from class1;";ret = sqlite3_exec(db,sql,callback,"into callback",&errmsg);//獲取錯誤碼,和錯誤信息if( ret != SQLITE_OK ){//fprintf(stderr, "SQL error: %s\n", errmsg);printf("ret = %d,error messsge:%s \n",ret,errmsg);sqlite3_free(errmsg);}else{fprintf(stdout, "Operation done successfully\n");}sqlite3_close(db);return 0 ;
}
5.DELETE操作
下面的 C 代碼段顯示了如何使用 DELETE 語句刪除任何記錄,然后從 class1 表中獲取并顯示剩余的記錄:
刪除表中的數(shù)據(jù):
delete from stu where id = 211;
代碼:
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>int callback(void *arg, int column_size, char *column_value[], char*column_name[])
{int i ;printf("%s\n",(char *)arg);for(i = 0;i<column_size;i++){printf("%s = %s\n",column_name[i],column_value[i]);}printf("=================================\n");return 0 ;//必須返回0,這樣數(shù)據(jù)庫中有多少條數(shù)據(jù),這個回調(diào)函數(shù)就會被調(diào)用多少次
}int main(int argc,char **argv)
{sqlite3 *db;int ret;char *sql = NULL;char *errmsg = NULL;if(argc<2){printf("Uage: %s xxx.db\n",argv[0]);exit(-1);}if((ret = sqlite3_open(argv[1],&db)) == SQLITE_OK ){printf("ret = %d ,open %s success \n",ret,argv[1]);}else{printf("ret = %d,error messsge:%s \n",sqlite3_errcode(db),sqlite3_errmsg(db));exit(-1);}/*******************************先查看class1表里面有什么數(shù)據(jù)調(diào)用delete 刪除一條數(shù)據(jù)再次查看class1表里面的數(shù)據(jù)
********************************/sql = "select * from class1;" \"delete from class1 where id = 211;"\"select * from class1;";ret = sqlite3_exec(db,sql,callback,"into callback",&errmsg);//獲取錯誤碼,和錯誤信息if( ret != SQLITE_OK ){//fprintf(stderr, "SQL error: %s\n", errmsg);printf("ret = %d,error messsge:%s \n",ret,errmsg);sqlite3_free(errmsg);}else{fprintf(stdout, "Operation done successfully\n");}sqlite3_close(db);return 0 ;
}
對嵌入式SQLite數(shù)據(jù)庫的學(xué)習(xí),圓滿收官!!