SQLite3

數據庫簡介

常用的數據庫

大型數據庫:Oracle
中型數據庫:Server 是微軟開發的數據庫產品,主要支持 windows 平臺。
小型數據庫:mySQL 是一個小型關系型數據庫管理系統,開放源碼 。(嵌入式不需要存儲太多數據。)

SQLite 基礎

SQLite 的源代碼是 C,其源代碼完全開放,是一個輕量級的嵌入式數據庫。

特性:

1、零配置一無需安裝和管理配置;
2、儲存在單一磁盤文件中的一個完整的數據庫;
3、數據庫文件可以在不同字節順序的機器間自由共享;
4、支持數據庫大小至2TB;
5、嵌入式足夠小,全部源碼大致3萬行 c 代碼,250KB;
6、比目前流行的大多數數據庫對數據的操作要快;

創建 SQLite 數據庫:

-----------------兩種方式都會用得到,重點是代碼創建--------------------

手工創建:

使用 sqlite3 工具,通過手工輸入 SQL 命令行完成數據庫創建。

代碼創建:

在代碼中常常動態創建數據庫 —— 在程序運行過程中,當需要進行數據庫操作時,應用程序會首先嘗試打開數據庫,如果數據庫并不存在,則程序將自動建立數據庫,然后再打開數據庫。

Linux 虛擬機中 sqlite3 的安裝

在線安裝方式

1) 確保虛擬機能聯網
2)
● sudo apt-get update
● sudo apt-get install sqlite3
● sudo apt-get install libsqlite3-dev
● sudo apt-get install sqlitebrowser
安裝軟件及開發環境
—>sqlite3 數據庫軟件
—>sqlite3 數據庫開發支持庫
—>sqlite3 數據庫操作軟件
3) 安裝成功后,終端輸入以下指令,判斷是否安裝成功:

sqlite3  my.db

出現下列語句,表示安裝成功,版本不一樣無所謂,只要出現“sqlite>”即可,輸入“.quit”退出數據庫:
在這里插入圖片描述

基礎 SQL語句 的使用

兩種命令格式:

sqlite3 系統命令

—— 以“.”開頭;

SQL 命令

—— 以“;”結尾。

API 接口

(👆 跳轉至 SQLite 官網)常用接口見 “sqlite3 編程”。
在這里插入圖片描述

sqlite3 的使用:

1、創建一個數據庫(數據庫為空時,找不到圖標);
在這里插入圖片描述

2、在新建的數據庫中,創建一張表,并設置主鍵;(表格創建成功后,數據庫的圖標顯現)
在這里插入圖片描述

3、向新建的表中插入數據;
在這里插入圖片描述
在這里插入圖片描述

4、查詢表格中的數據;
在這里插入圖片描述

在這里插入圖片描述

5、打開圖形化數據庫;
在這里插入圖片描述

6、刪除表中一行;
在這里插入圖片描述

7、刪除整張表;
在這里插入圖片描述

8、刪除數據庫;
在這里插入圖片描述

sqlite3 編程

(👆 跳轉至 SQLite 官網)
在這里插入圖片描述

sqlite3_open

#include<sqlite3.h>
int  sqlite3_open(char *path, sqlite3 **db);功能:打開 sqlite 數據庫(或新建數據庫) 
參數:path:	數據庫文件路徑         db: 		指向數據庫句柄的指針 - 該二級指針指向一級指針,最終會存儲打開的數據庫的首地址
返回值:成功返回0,失敗返回錯誤碼(非零值)	使用: 	sqlite3 *db;if(sqlite3_open("stu.db", &db) != 0)fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));// sqlite3 自帶的打印錯誤信息	值傳遞:   獲取到值
地址傳遞: 修改值

sqlite3_close

#include<sqlite3.h>
int  sqlite3_close(sqlite3 *db);功能:關閉 sqlite 數據庫
參數:db
返回值:成功返回0,失敗返回錯誤碼

sqlite3_errmsg

#include<sqlite3.h>
const  char  *sqlite3_errmsg(sqlite3 *db);
功能:  打印錯誤信息
參數:db
返回值:返回錯誤信息
使用(e.g.):   fprintf(stderr, "sqlite3_open failed: %s\n", sqlite3_errmsg(db));

sqlite3_exec

原型:int sqlite3_exec(sqlite3 *db,                               		/* An open database */const char *sql,                           		/* SQL to be evaluated */int (*callback)(void*, int, char**, char**),  	/* Callback function */void *arg,                                 		/* 1st argument to callback */char **errmsg                              		/* Error msg written here */);功能:執行sql語句;
參數:sqlite3 *db:		指定要操作的數據庫句柄指針;char *sql:			指定要執行的sql語句;int (*callback)(void*, int, char**, char**):回調函數; 該函數指針可以指向返回值是int類型,參數列表是(void*, int, char**, char**)的函數void *arg:			傳遞給回調函數的第一個參數;  - 類似線程函數傳參,需強轉 - 不傳參可以填 NULLchar **errmsg:	該二級指針指向的一級指針會存儲錯誤信息的首地址,錯誤信息存儲在靜態存儲區;(定義一個一級指針即可)                                   
返回值:成功:返回 SQLITE_OK,即 0;失敗:返回 error_code,即非 0
// sqlite3.c#include <stdio.h>
#include <sqlite3.h>int num;
char buf[128] = {};
typedef struct{int id;char name[32];float score;
} STU; int main(int argc, char const *argv[])
{sqlite3 *db = NULL;if (sqlite3_open("/home/hq/MyFolders/sqlite3/testdb.db", &db)){fprintf(stderr, "Sqlite3_open failed: %s\n", sqlite3_errmsg(db));return -1;}char *errmsg = NULL;if (sqlite3_exec(db, "CREATE TABLE stu(id int primary key, name char, score float);",NULL, NULL, &errmsg)){fprintf(stderr, "Failed to create a table named \"stu\": %s\n", errmsg);return -1;}if (sqlite3_exec(db, "INSERT INTO stu VALUES(2023052201, \"Frank\", 95);", NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}printf("Please input a number:\n");scanf("%d", &num);STU stu;for (int i = 0; i < num; i++){scanf("%d %s %f", &stu.id, stu.name, &stu.score);sprintf(buf, "INSERT INTO stu VALUES(%d, \"%s\", %f);", stu.id, stu.name, stu.score);if (sqlite3_exec(db, buf, NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}}sqlite3_close(db);return 0;
}

運行結果如下:
在這里插入圖片描述
在這里插入圖片描述

sqlite3_exec 的 回調函數 callback

int callback(void *arg, int columns, char **column_text, char **column_name);功能:sqlite3_exec 每找到一條滿足條件的記錄,就會執行一次回調函數。
參數:void *arg:		sqlite3_exec 的第四個參數傳入;int columns:	查詢結果的列數;char **column_text:該二級指針指向一個指針數組,數組中的元素都是 char*類型 的指針,指針指向查詢結果的內容;char **column_name:該二級指針指向一個指針數組,數組中的元素都是 char*類型 的指針,指針指向查詢結果的列名;
返回值:成功時候必須返回0,該返回值會返回給 sqlite3_exec 函數,如果沒有返回0,則 sqlite3_exec 會認為回調函數運行失敗,從而導致 sqlite3_exec 運行失敗。 

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

// sqlite3.c#include <stdio.h>
#include <sqlite3.h>int num;
char buf[128] = {};
typedef struct{int id;char name[32];float score;
} STU; int select_cback(void *arg, int columns, char **column_text, char **column_name){printf("columns: %d\n", columns);printf("column_name: ");for (int i = 0; i < columns; i++)printf("%-12s", column_name[i]); putchar(10);printf("column_text: ");for (int i = 0; i < columns; i++)printf("%-12s", column_text[i]);putchar(10);return 0;
}int main(int argc, char const *argv[])
{sqlite3 *db = NULL;if (sqlite3_open("/home/hq/MyFolders/sqlite3/testdb.db", &db)){fprintf(stderr, "Sqlite3_open failed: %s\n", sqlite3_errmsg(db));return -1;}char *errmsg = NULL;if (sqlite3_exec(db, "CREATE TABLE stu(id int primary key, name char, score float);",NULL, NULL, &errmsg)){fprintf(stderr, "Failed to create a table named \"stu\": %s\n", errmsg);}if (sqlite3_exec(db, "INSERT INTO stu VALUES(2023052201, \"Frank\", 95);", NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}printf("Please input a number:\n");scanf("%d", &num);STU stu;for (int i = 0; i < num; i++){scanf("%d %s %f", &stu.id, stu.name, &stu.score);sprintf(buf, "INSERT INTO stu VALUES(%d, \"%s\", %f);", stu.id, stu.name, stu.score);if (sqlite3_exec(db, buf, NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}}if (sqlite3_exec(db, "SELECT * FROM stu;", select_cback, NULL, &errmsg)){fprintf(stderr, "Select failed: %s\n", errmsg);return -1;}printf("------------------------\n");if (sqlite3_exec(db, "SELECT name FROM stu WHERE score = 92;", select_cback, NULL, &errmsg)){fprintf(stderr, "Select failed: %s\n", errmsg);return -1;}sqlite3_close(db);return 0;
}

運行結果如下:
在這里插入圖片描述

在這里插入圖片描述

sqlite3_get_table(不回調查詢)

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:	該二級指針指向的一級指針會存儲錯誤信息首地址 
返回值:成功返回SQLITE_OK,失敗返回錯誤碼

在這里插入圖片描述

// sqlite3.c#include <stdio.h>
#include <sqlite3.h>int num;
char buf[128] = {};
typedef struct{int id;char name[32];float score;
} STU; int main(int argc, char const *argv[])
{sqlite3 *db = NULL;if (sqlite3_open("/home/hq/MyFolders/sqlite3/testdb.db", &db)){fprintf(stderr, "Sqlite3_open failed: %s\n", sqlite3_errmsg(db));return -1;}char *errmsg = NULL;if (sqlite3_exec(db, "CREATE TABLE stu(id int primary key, name char, score float);",NULL, NULL, &errmsg)){fprintf(stderr, "Failed to create a table named \"stu\": %s\n", errmsg);}if (sqlite3_exec(db, "INSERT INTO stu VALUES(2023052201, \"Frank\", 95);", NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}printf("Please input a number:\n");scanf("%d", &num);STU stu;for (int i = 0; i < num; i++){scanf("%d %s %f", &stu.id, stu.name, &stu.score);sprintf(buf, "INSERT INTO stu VALUES(%d, \"%s\", %f);", stu.id, stu.name, stu.score);if (sqlite3_exec(db, buf, NULL, NULL, &errmsg)){fprintf(stderr, "Failed to insert: %s\n", errmsg);return -1;}}char **resultp;int nrow, ncolumn;if (sqlite3_get_table(db, "SELECT * FROM stu;", &resultp, &nrow, &ncolumn, &errmsg)){fprintf(stderr, "Failed to select: %s\n", errmsg);return -1;}printf("--------------------\n");for (int i = 0; i <= nrow; i++){     			// 要包含表頭for (int j = 0; j < ncolumn; j++)printf("%-12s", resultp[i*ncolumn+j]);putchar(10);}sqlite3_close(db);return 0;
}

運行結果如下:
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161377.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161377.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161377.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

點云從入門到精通技術詳解100篇-基于點云數據的機器人裝焊 過程在線測量(下)

目錄 裝焊過程在線測量技術研究 4.1 測量參數介紹 4.1.1 筋板定位測量參數

Rust個人學習之結構體

第一反應&#xff0c;Rust結構體跟python的很像&#xff0c;不知道感覺對不對&#xff1b; 書中提到第一反應&#xff0c;Rust結構體跟python的很像&#xff0c;不知道感覺對不對&#xff1b; 書中提到&#xff1a;結構體是一種自定義數據類型&#xff0c;它允許命名多個相關的…

Seaborn畫圖顏色和給定的RGB hex code不一致

使用以下代碼畫圖&#xff1a; import seaborn as sns import matplotlib.pyplot as plt plt.figure(dpi150) x [A,B,C,D] y [164, 86, 126, 53] sns.barplot(xx, yy, color#3a923a) 得到的顏色如下圖所示&#xff1a; 這是因為seaborn默認降低了顏色的飽和度&#xff0c;即…

UDP中connect的作用

udpclientNoConnect.c里邊的內容如下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include <errno.h> #include <syslog.h…

23屆萬興校招golang一面面經

問題有結合我的簡歷來問,面試官還是很友好的 1、你是如何學習go的(擴展講) go語言的基本概念和語法&#xff0c;上手golang開源項目跟架構(gin,gorm)&#xff0c;資料找官網。 2、項目深挖 為什么選擇gin? Gin路由使用了前綴樹算法&#xff0c;beego路由使用的正則算法和較為重…

基于 Flink CDC 打造企業級實時數據集成方案

本文整理自Flink數據通道的Flink負責人、Flink CDC開源社區的負責人、Apache Flink社區的PMC成員徐榜江在云棲大會開源大數據專場的分享。本篇內容主要分為四部分&#xff1a; CDC 數據實時集成的挑戰Flink CDC 核心技術解讀基于 Flink CDC 的企業級實時數據集成方案實時數據集…

獨立版求職招聘平臺小程序開發

小程序招聘系統開發 我們開發了一款高效、便捷的互聯網招聘平臺。在這里&#xff0c;可以輕松實現企業入駐、職位發布、在線求職、精準匹配職位和人才&#xff0c;以及參與招聘會等功能。目標是為求職者和企業搭建一個連接彼此的橋梁&#xff0c;幫助您更快地找到滿意的工作&…

SpringMVC(五)SpringMVC的視圖

SpringMVC中的視圖是View接口&#xff0c;視圖的作用渲染數據&#xff0c;將模型Model中的數據展示給用戶 SpringMVC視圖的種類很多&#xff0c;默認有轉發視圖(InternalResourceView)和重定向視圖(RedirectView) 當工程引入jstl的依賴&#xff0c;轉發視圖會自動轉換為JstlV…

深度學習 loss 是nan的可能原因

1 loss 損失值非常大&#xff0c;超過了浮點數的范圍&#xff0c;所以表示為overflow 狀態下的男。 解決辦法&#xff1a; 減小學習率&#xff0c;觀察loss值是不是還是nan 在將數據輸入模型前&#xff0c;進行恰當的歸一化 縮放 2 loss 的計算中存在除以0&#xff0c; log(0…

Java架構師軟件架構開發

目錄 1 基于架構的軟件開發導論2 ABSD架構方法論3 ABSD方法論具體實現4 ABSD金融業案例5 基于特定領域的軟件架構開發導論6 DSSA領域分析7 DSSA領域設計和實現8 DSSA國際電商平臺架構案例9 架構思維方法論概述10 AT方法論和案例想學習架構師構建流程請跳轉:Java架構師系統架構…

應用軟件安全編程--25考慮對函數指針進行加密

在某些情況下&#xff0c;攻擊者可以通過修改內存甚至函數指針來執行任意代碼。為了減少這類攻擊的影 響&#xff0c;函數指針應該在運行時進行加密&#xff0c;并在執行程序時才進行解密。 對于考慮對函數指針進行加密的情況&#xff0c;示例1給出了不規范用法(C/C 語言)示…

Unity UI設計 軟件構造實驗報告

實驗1: 仿真系統的UI主界面設計 1.實驗目的 &#xff08;1&#xff09;熟悉Unity中UI界面的設計與編寫&#xff1b; &#xff08;2&#xff09;熟悉UI界面中場景轉換,UI與場景內容相互關聯的方式。 &#xff08;3&#xff09;熟悉Unity中MySQL數據庫的操作 2.實驗內容 新建…

設計模式—單一職責原則

1.背景 單一職責原則&#xff08;SRP&#xff1a;Single responsibility principle&#xff09;又稱單一功能原則&#xff0c;面向對象五個基本原則&#xff08;SOLID&#xff09;之一。它規定一個類應該只有一個發生變化的原因。該原則由羅伯特C馬丁&#xff08;Robert C. Ma…

生成式AI與大語言模型,東軟已經準備就緒

伴隨著ChatGPT的火爆全球&#xff0c;數以百計的大語言模型也爭先恐后地加入了這一戰局&#xff0c;掀起了一場轟轟烈烈的“百模大戰”。毋庸置疑的是&#xff0c;繼方興未艾的人工智能普及大潮之后&#xff0c;生成式AI與大語言模型正在全球開啟新一輪生產力革新的科技浪潮。 …

【C語言】深入理解指針(四)

&#x1f308;write in front :&#x1f50d;個人主頁 &#xff1a; 啊森要自信的主頁 ??真正相信奇跡的家伙&#xff0c;本身和奇跡一樣了不起啊&#xff01; 歡迎大家關注&#x1f50d;點贊&#x1f44d;收藏??留言&#x1f4dd;>希望看完我的文章對你有小小的幫助&am…

帝國cms開發一個泛知識類的小程序的歷程記錄

#帝國cms小程序# 要開發一個泛知識類的小程序&#xff0c;要解決以下幾個問題。 1。知識內容的分類。 2。知識內容的內容展示。 3。知識內容的價格設置。 4。用戶體系&#xff0c;為簡化用戶的操作&#xff0c;在用戶進行下載的時候&#xff0c;請用戶輸入手機號&#xff…

【HarmonyOS】API6上JS實現視頻播放全屏播放時,會回到之前界面

【關鍵字】 API6 / 視頻播放 / 全屏播放異常 【問題現象】 開發者在API6上用JS實現視頻播放器點全屏播放后&#xff0c;不是全屏效果&#xff0c;實際效果是變成了橫屏并返回到首頁。 具體代碼實現是參考video媒體組件指南。 【問題分析】 JS實現視頻播放器有Codelab代碼示…

DedeBIZ 管理系統 DedeV6 v6.2.6 社區版 免費授權版

DedeBIZ 系統&#xff1a;開源、安全、高效的 DedeV6 v6.2.6 社區版 DedeBIZ 系統是基于 PHP 7 版本開發的&#xff0c;具有強大的可擴展性&#xff0c;并且完全開放源代碼。它采用現流行的 Go 語言設計開發&#xff0c;不僅擁有簡單易用、靈活擴展的特性&#xff0c;還具備更…

ElasticSearch之Health API

查看當前集群全部健康指標的信息&#xff0c;執行如下命令&#xff1a; curl -X GET "https://localhost:9200/_health_report?pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下&#xff1a; {&quo…

Niushop 開源商城 v5.1.7:支持PC、手機、小程序和APP多端電商的源碼

Niushop 系統是一款基于 ThinkPHP6 開發的電商系統&#xff0c;提供了豐富的功能和完善的商品機制。該系統支持普通商品和虛擬商品&#xff0c;并且針對虛擬商品還提供了完善的核銷機制。同時&#xff0c;它也支持新時代的商業模式&#xff0c;如拼團、分銷和多門店砍價等營銷活…