如何快速使用C語言操作sqlite3

itopen組織
1、提供OpenHarmony優雅實用的小工具
2、手把手適配riscv + qemu + linux的三方庫移植
3、未來計劃riscv + qemu + ohos的三方庫移植 + 小程序開發
4、一切擁抱開源,擁抱國產化

一、sqlite3庫介紹

sqlite3庫可從官網下載,當前版本為sqlite3 3.45.3
https://www.sqlite.org/download.html

二、sqlite3編譯

2.1 x86_64架構安裝

2.1.1 命令安裝

sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev

2.1.2 源碼編譯安裝

./configure
make -j$(nproc)
sudo make install

2.2 基于arm架構編譯

2.2.1 下載工具鏈并安裝

# 下載工具鏈
wget https://repo.huaweicloud.com/openharmony/compiler/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi/1.0/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi.tar.gz
tar -xvf prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi.tar.gz# 設置工具鏈的路徑
vim ~/.bashrc
# 最后一行添加
export PATH=~/bin/prebuilts_gcc_linux-x86_arm_gcc-linaro-7.5.0-arm-linux-gnueabi/bin:$PATH
# 重置.bashrc
source ~/.bashrc

2.2.2 編譯sqlite3

export CC=aarch64-linux-gnu-gcc
./configure --prefix=$PWD/_install CC=aarch64-linux-gnu-gcc --host=aarch64-linux
./configure --prefix=$PWD/_install
make -j$(nproc)
make install

2.3 基于riscv64架構編譯

2.3.1 工具鏈安裝

sudo apt-get install gcc-riscv64-linux-gnu

2.3.2 編譯sqlite3

./configure --prefix=$PWD/_install CC=riscv64-linux-gnu-gcc --host=riscv64-linux
make -j$(nproc)
make install

三、接口介紹

參考鏈接:
https://geek-docs.com/sqlite

3.1 打開/創建數據庫

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

3.2 關閉數據庫

int sqlite3_close(sqlite3 *db);

3.3 執行sql語句

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

3.4 獲取結果內容

int sqlite3_get_table(sqlite3 *db,const char *zSql,char ***pazResult,int *pnRow,int *pnColumn,char **pzErrmsg);

3.5 獲取錯誤信息

const char *sqlite3_errmsg(sqlite3 *db);

3.6 釋放表空間

void sqlite3_free_table(char **result);

四、sqlite3語句

4.1 sqlite數據類型

NULL:標識一個NULL值
INTEGER(intger):整數類型 int
REAL(real):浮點數 float,double
TEXT(text):字符串 ""
CHAR(char):字符''

4.2 創建表

create if not exists table table_name(column1 type1, column2 type2, column3 type3……);
# 例如創建一個名為dictory的表(sheet),里面有word、translation等字段
create table if not exists table_name(word text, translation text);# not null 指定列不允許為NULLcreate table if not exists student(student_name txt not NULL, id txt not NULL, sex char);# defaultinsert into語句沒有提供特定的值時,為列提供一個默認值
create table if not exists student(student_name txt not NULL, id txt not NULL, sex char, grade integer default 99);# unique 約束防止一個特定的列存在兩個相同的值
create table if not exists student(student_name txt not NULL unique, id txt not NULL, sex char);# check 約束 啟用輸入一條記錄要檢查值的條件。如果條件值為false,則記錄違反了約束,且不能輸入到表
create table if not exists student(student_name txt not NULL, id txt not NULL, sex char, grade intger check(grade > 0));

4.3 添加記錄

insert into table_name(column1, column2, column3) values(val1, val2, val3);
insert into student(student_name, id, sex) values ('z3', '123', 'm');
或者
insert into student values('z3', '123', 'm');

4.4 查詢

4.4.1 查看表結構

.schema

4.4.2 查看所有表

.tables

4.4.3 查看記錄

# 獲取所有數據記錄
select * from table_name;# 限制輸出數據記錄數量
select * from table_name limit val;# 升序輸出數據記錄
select * from table_name order by column asc;
select * from dictory order by word asc;# 降序輸出數據記錄
select * from table_name order by column desc;
select * from dictory order by word desc;# 條件查詢
select * from table_name where expression;
select * from table_name where column in ('val1', 'val2', 'val3');
select * from table_name where column = 'val1' or column = 'val2';
select * from table_name where column between val1 and val2;
select * from people where age>=10 and age <=15;
select name, age from people where age>= 10 and age<=15;
select * from table_name where column like 'xx%' or 'xxx_';
百分號(%)代表零個、一個或者多個數字或字符 
下劃線(_)代表一個單一數字或字符 

4.5 修改數據記錄

update table_name set column1=val1, column2=val2 where expression;
update student_info set id=0002, name=hencai where id=0001;

4.6 表中添加字段

alter table <table_name> add column <field> <type>;
alter table stu add column age integer;

4.7 刪除數據記錄

delete from table_name [where expression];
delete from stu where id=123;

4.8 刪除表

drop table table_name;
drop table student;

4.9 刪除指定字段

# step1:備份為temp id , name , age , sex
alter table info rename to temp;# step2:創建新表
create table info(id, name, age);#step3:導出到新表
insert into info select id, name, age from temp;

4.10 退出sqlite3

.quit

五、sqlite3庫封裝

5.1 封裝庫代碼

代碼來源 itopen組織: test

sqlite3_lib.c代碼

#include "sqlite3_lib.h"struct Sqlite3SyncOps sqlite3Sync[] = {{SQLITE3_SYNC_MODE_FULL, "PRAGMA synchronous = FULL"},{SQLITE3_SYNC_MODE_NORMAL, "PRAGMA synchronous = NORMAL"},{SQLITE3_SYNC_MODE_OFF, "PRAGMA synchronous = OFF"},
};int CreateDatabase(char *dbname, sqlite3 **db)
{int ret = sqlite3_open(dbname, db);if (ret != SQLITE_OK) {printf("sqlite3_open error: %s\n", sqlite3_errmsg(*db));return -1;}return SQLITE_OK;
}int SetDatabaseSync(sqlite3 *db, enum Sqlite3SyncMode mode)
{char *errmsg = NULL;if (db == NULL) {printf("db is NULL\n");return -1;}if (sqlite3_exec(db, sqlite3Sync[mode].sql, NULL, NULL, &errmsg)) {printf("sqlite3_exec error: %s\n", errmsg);sqlite3_free(errmsg);return -1;}return SQLITE_OK;
}int CreateDataSheet(sqlite3 *db, const char *sql)
{char *errmsg = NULL;if (db == NULL) {printf("db is NULL\n");return -1;}if (sqlite3_exec(db, sql, NULL, NULL, &errmsg)) {printf("sqlite3_exec error: %s\n", errmsg);sqlite3_free(errmsg);return -1;}return SQLITE_OK;
}int InsertDataValue(sqlite3 *db, const char *sheet, const char *column, const char *value)
{int i;char sql[1024];char *errmsg = NULL;if (db == NULL) {printf("db is NULL\n");return -1;}sprintf(sql, "insert into %s(%s) values (%s);", sheet, column, value);printf("sql: %s\n", sql);if (sqlite3_exec(db, sql, NULL, NULL, &errmsg)) {printf("sqlite3_exec error: %s\n", errmsg);sqlite3_free(errmsg);return -1;}return SQLITE_OK;
}int CloseDatabase(sqlite3 *db)
{if (db == NULL) {return 0;}return sqlite3_close(db);
}

sqlite3_lib.h代碼

#ifndef __SQLITE3_LIB_H__
#define __SQLITE3_LIB_H__#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>enum Sqlite3SyncMode {// 在每次寫入操作完成之前,會等待數據被寫入磁盤后再繼續下一步操作。這種模式具有最高的數據完整性和可靠性,但性能會受到一定影響SQLITE3_SYNC_MODE_FULL = 0,// 在寫入操作完成之后,會等待數據被寫入磁盤的操作系統緩存中后再繼續下一步操作。這種模式在數據完整性和性能之間達到了一種平衡,適用于大多數場景SQLITE3_SYNC_MODE_NORMAL,// 在寫入操作完成后,不會等待數據被寫入磁盤,直接繼續下一步操作。這種模式具有最高的性能,但數據的完整性和可靠性可能會受到一定影響。適用于對數據完整性要求不高的場景,例如緩存數據SQLITE3_SYNC_MODE_OFF
};struct Sqlite3SyncOps {int id;char *sql;
};int CreateDatabase(char *dbname, sqlite3 **db);
int SetDatabaseSync(sqlite3 *db, enum Sqlite3SyncMode mode);
int CreateDataSheet(sqlite3 *db, const char *sql);
int InsertDataValue(sqlite3 *db, const char *sheet, const char *column, const char *value);
int CloseDatabase(sqlite3 *db);#endif /* end of __SQLITE3_LIB_H__ */

Makefile代碼

#************************************************************************
#> File Name: Makefile.c
#> Author: Wenfei6316
#> Mail: wen_fei@hoperun.com 
#> Created Time: 2024年07月1日 星期一 03時44分36秒
#************************************************************************sqlite3_lib:
    gcc sqlite3_lib.c -fPIC -shared -o libsqlite3_lib.so
all: sqlite3_lib ECHOgcc main.c -o main -lsqlite3 -L./ -lsqlite3_libECHO:
    @echo $(SUBDIR)@echo "========>begin compile"    clean:find ./ -name "*.o" -exec rm {} \;

六、Demo樣例

6.1 dictory創建

#include "sqlite3_lib.h"#define CREATE_TABLE "create table if not exists dict(word text primary key, translation text);"int main(int argc, char **argv)
{int i;int cnt = 1;int ret;FILE *fp = NULL;sqlite3 *db = NULL;char buf[1024] = {0};char value[1024] = {0};printf("start create database\n");// 1. 創建數據庫ret = CreateDatabase("dictionary.db", &db);if (ret != SQLITE_OK) {printf("CreateDatabase error: %s\n", sqlite3_errmsg(db));return -1;}// 2. 設置數據庫同步模式ret = SetDatabaseSync(db, SQLITE3_SYNC_MODE_FULL);if (ret != SQLITE_OK) {printf("SetDatabaseSync error: %s\n", sqlite3_errmsg(db));return -1;}// 3. 常見表格ret = CreateDataSheet(db, CREATE_TABLE);if (ret != SQLITE_OK) {printf("CreateDataSheet error: %s\n", sqlite3_errmsg(db));return -1;}// 4. 插入數據fp = fopen("dict.txt", "r");if (fp == NULL) {printf("open dict.txt error\n");return -1;}while (fgets(buf, sizeof(buf), fp) != NULL) {if (buf[strlen(buf)-1] == '\n') {buf[strlen(buf)-1] = '\0';}// 獲取單詞結尾地方并設置為\0, 以及翻譯起始位置for (i = 0; buf[i] != ' '; i++);buf[i] = '\0';for(; buf[++i] == ' ';);// 插入數據到數據庫snprintf(value, 1024, "\"%s\", \"%s\"", &buf[0], &buf[i]);printf("%d: value: %s\n", cnt++, value);ret = InsertDataValue(db, "dict", "word, translation", value);if (ret != SQLITE_OK) {printf("InsertDataValue error: %s\n", sqlite3_errmsg(db));return -1;}memset(buf, '\0', sizeof(buf));memset(value, '\0', sizeof(value));}fclose(fp);CloseDatabase(db);printf("close database success\n");return 0;
}

附錄

另有Python簡單封裝的sqlite3操作可參見 itopen組織: module_code

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

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

相關文章

systemctl命令使用

systemctl 作用&#xff1a;可以控制軟件&#xff08;服務&#xff09;的啟動、關閉、開機自啟動 系統內置服務均可被systemctl控制第三方軟件&#xff0c;如果自動注冊了可以被systemctl控制第三方軟件&#xff0c;如果沒有自動注冊&#xff0c;可以手動注冊 語法 systemct…

#### golang的append到底干了啥 ####

代碼1.0 package mainimport "fmt"func main() {a : make([]int64, 0, 0) // 改為 a : make([]int64, 0, 2) 時執行輸出也都一樣的println(fmt.Sprintf("a: %v", a))// 輸出&#xff1a;a: []solve(a)println(fmt.Sprintf("a: %v", a))// 輸出&…

企業出海如何應對國際差旅報銷的復雜性?

在全球化浪潮的推動下&#xff0c;越來越多的中國企業開始邁向國際市場。然而&#xff0c;企業在“走出去”的過程中不僅面臨新的商機&#xff0c;也需要克服諸多挑戰。尤其是國際差旅報銷的復雜性&#xff0c;成為出海企業必須解決的重要問題。 國際差旅報銷的四大挑戰 多元…

【分布式數據倉庫Hive】常見問題及解決辦法

目錄 一、啟動hive時發現log4j版本和hadoop的版本有沖突 解決辦法&#xff1a;刪除hive下高版本的slf4j 二、啟動hive報錯 Exception in thread "main" java.lang.NoSuchMethodError:com.google.common.base.Preconditions.checkArgument(ZLjava/lang/Object;)V …

postgres數據庫的流復制

1. 流復制和邏輯復制的差異 邏輯復制和流復制最直觀的不同是&#xff0c;邏輯復制支持表級別復制區分點事原理不同 邏輯日志是在wal日志產生的數據庫上&#xff0c;由邏輯解析模塊對wal日志進行初步的解析&#xff0c;解析結果是ReorderBufferChange&#xff08;理解為HeapTup…

干貨分享|如何將前端代理服務器(BFF)接入身份認證(3完結篇)

續集3 前篇文章在前面發布&#xff0c;同學們可以自行找一下。 本篇文章將繼續通過實例來詳細講解如何將前端代理服務器&#xff08;BFF&#xff09;接入身份認證。我們將使用一個示例應用來演示 BFF 與身份認證的集成過程。 3 在 Full BFF 中接入認證平臺 本小節將介紹如何…

Raylib 坐標系適應與GPU繪制參數

通過750 - 鼠標坐標&#xff0c;把原點在左上角的鼠標坐標變成左下角 實現輸入數據后的坐標系同GPU原點在左下角坐標相同&#xff0c; 比數組0&#xff0c;0對應左上角好&#xff0c; 此時實際上數組0&#xff0c;0對應左下角 #include <raylib.h> // 感受&#xff1a…

【SpringBoot配置文件讀取】無法讀取yaml文件中文字符

1. yaml配置文件 注意要將該文件編碼格式改為UTF-8 spring:application:name: 好好學習admin:name: 李斯age: 24books:- name: 數據結構desc: 數據書- name: 編譯原理desc: 編譯書2.配置實體類 Data設置get&#xff0c;set方法Component注冊為BeanConfigurationProperties(p…

開發者聊科學作息時間表

非常有幸對科學作息時間表app的開發者做一次采訪。 問&#xff1a;你對科學作息時間表app滿意么&#xff1f; 答&#xff1a;非常不滿意&#xff0c;我們的設想是讓他更智能&#xff0c;更多的提醒方式&#xff0c;更好的交互體驗。如果作為一個鬧鐘他是非常不合格的&#xff0…

輕松駕馭Python 3.11:Windows環境下的安裝與配置全攻略

引言 Python是一種功能強大且易于學習的編程語言&#xff0c;廣泛應用于Web開發、數據分析、人工智能和自動化等領域。為了在Windows中使用Python&#xff0c;首先需要安裝Python解釋器并進行環境配置。本文將詳細介紹如何在Windows中安裝Python 3.11并進行環境配置。 目錄 …

R可視化數據必要格式——長格式

一、引言 我們在對數據進行可視化時遇到最頭疼、最常見的問題是什么&#xff1f;數據問題。 因為我們往往不會從零自己編程進行可視化&#xff0c;往往是現有模板或積累&#xff0c;而正確的數據格式對應正確的圖形包要求&#xff0c;一定會正確出圖&#xff0c;所以只有一個問…

調試 hipcc 的llvm llc gpu目標代碼生成模塊

源碼&#xff1a; hello_vectorAdd.hip: __global__ void vectorAdd(const float *A, const float *B, float *C) {int i blockDim.x * blockIdx.x threadIdx.x;C[i] A[i] B[i] 0.0f; } Makefile: x.O1.s: hello_vectorAdd.hip../../local_amdgpu/bin/clang ./hello_vec…

力扣hot100-普通數組2

文章目錄 題目&#xff1a;輪轉數組方法1-使用額外的數組方法2-三次反轉數組 除自身以外數組的乘積方法1-用到了除法方法2-前后綴乘積法 題目&#xff1a;輪轉數組 原題鏈接&#xff1a;輪轉數組 方法1-使用額外的數組 方法1是自己寫出來的。方法2參考的別人的&#xff0c;…

通配符和正則表達式之間的關系

通配符和正則表達式&#xff08;正則&#xff09;都是用于匹配字符串的工具&#xff0c;但它們的復雜性和用途有所不同。下面是它們之間的主要關系和區別&#xff1a; 通配符 通配符主要用于簡單的模式匹配&#xff0c;常見于文件系統操作中&#xff0c;例如在命令行中查找文…

AttackGen:一款基于LLM的網絡安全事件響應測試工具

關于AttackGen AttackGen是一款功能強大的網絡安全事件響應測試工具&#xff0c;該工具利用了大語言模型和MITRE ATT&CK框架的強大功能&#xff0c;并且能夠根據研究人員選擇的威脅行為組織以及自己組織的詳細信息生成定制化的事件響應場景。 功能介紹 1、根據所選的威脅行…

【MindSpore學習打卡】應用實踐-計算機視覺-FCN圖像語義分割-基于MindSpore實現FCN-8s進行圖像語義分割的教程

圖像語義分割是計算機視覺領域中的一個重要任務&#xff0c;它旨在對圖像中的每個像素進行分類&#xff0c;從而實現對圖像內容的詳細理解。在眾多圖像語義分割算法中&#xff0c;全卷積網絡&#xff08;Fully Convolutional Networks, FCN&#xff09;因其端到端的訓練方式和高…

7.7、指針和函數

代碼 #include <iostream> using namespace std;//實現兩個數字進行交換 void swap01(int a, int b) {int temp a;a b;b temp;cout << "swap01a " << a << endl;cout << "swap01b " << b << endl; }void sw…

08 docker Registry搭建docker私倉

目錄 本地鏡像發布流程 1. docker pull registry 下載鏡像 2. docker run 運行私有庫registry 3. docker commit 構建鏡像 4. docker tag 修改新鏡像&#xff0c;使之符合私服規范tag 5. 修改配置文件使之支持http 6. curl驗證私服庫上有什么鏡像 7. push推送 pull拉取 …

Activity、Window、DecorView的關系

目錄 一、Activity、Window、DecorView的層級關系如下圖所示&#xff1a; 1、Activity 2、Window 3、DecorView 二、DecorView初始化相關源碼 三、DecorView顯示時機 前言&#xff1a; 不同的Android版本有差異&#xff0c;以下基于Android 11進行講解。 一、Activi…

Halide AOT模式

這種模式會提前&#xff0c;會提前編譯好&#xff0c;變成dll什么的&#xff0c;可接受任何輸入的參數運行。 然后這樣調用&#xff0c;必須要make一下前一個file&#xff0c;才有后面的.h