Go 語言中操作 SQLite

sqlite以其無需安裝和配置:直接使用數據庫文件,無需啟動獨立的數據庫服務進程。

單文件存儲:整個數據庫(包括表、索引、數據等)存儲在單個跨平臺文件中,便于遷移和備份。

在應對的小型應用軟件中.有著不可取代的地位.

sqlite使用 參考?10.1.SQLite-CSDN博客

10.2sql-CSDN博客?

go語言中使用sqlite

1. 推薦使用?go-sqlite3?驅動,它基于 C 語言的 SQLite 庫實現:

go get github.com/mattn/go-sqlite3

2. 連接數據庫

使用 Go 標準庫?database/sql?結合驅動進行操作:

package mainimport ("database/sql""fmt"_ "github.com/mattn/go-sqlite3" // 導入但不直接使用
)func main() {// 打開數據庫連接(如果文件不存在會自動創建)db, err := sql.Open("sqlite3", "./test.db")if err != nil {panic(err)}defer db.Close() // 程序結束時關閉連接// 驗證連接是否有效if err := db.Ping(); err != nil {panic(err)}fmt.Println("成功連接到SQLite數據庫")
}

3. 創建表

使用?Exec?方法執行 SQL 語句:

// 創建表
func createTable(db *sql.DB) error {sqlStmt := `CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER);`_, err := db.Exec(sqlStmt)return err
}

4. 插入數據

支持普通插入和預處理語句(防止 SQL 注入):

// 普通插入
func insertData(db *sql.DB, name string, age int) error {sqlStmt := fmt.Sprintf("INSERT INTO users (name, age) VALUES ('%s', %d)", name, age)_, err := db.Exec(sqlStmt)return err
}// 預處理語句插入(推薦)
func insertDataWithPrepare(db *sql.DB, name string, age int) error {stmt, err := db.Prepare("INSERT INTO users (name, age) VALUES (?, ?)")if err != nil {return err}defer stmt.Close()_, err = stmt.Exec(name, age)return err
}

5. 查詢數據

  • 單條記錄:使用?QueryRow
  • 多條記錄:使用?Query
// 查詢單條記錄
func querySingleUser(db *sql.DB, id int) (string, int, error) {var name stringvar age interr := db.QueryRow("SELECT name, age FROM users WHERE id = ?", id).Scan(&name, &age)if err != nil {return "", 0, err}return name, age, nil
}// 查詢多條記錄
func queryAllUsers(db *sql.DB) ([]struct{ Name string; Age int }, error) {rows, err := db.Query("SELECT name, age FROM users")if err != nil {return nil, err}defer rows.Close()var users []struct{ Name string; Age int }for rows.Next() {var name stringvar age intif err := rows.Scan(&name, &age); err != nil {return nil, err}users = append(users, struct{ Name string; Age int }{name, age})}// 檢查迭代過程中是否有錯誤if err := rows.Err(); err != nil {return nil, err}return users, nil
}

6. 更新和刪除數據

// 更新數據
func updateUserAge(db *sql.DB, id, newAge int) error {stmt, err := db.Prepare("UPDATE users SET age = ? WHERE id = ?")if err != nil {return err}defer stmt.Close()_, err = stmt.Exec(newAge, id)return err
}// 刪除數據
func deleteUser(db *sql.DB, id int) error {stmt, err := db.Prepare("DELETE FROM users WHERE id = ?")if err != nil {return err}defer stmt.Close()_, err = stmt.Exec(id)return err
}

7. 事務處理

使用事務保證數據一致性:

func transferMoney(db *sql.DB, from, to int, amount float64) error {tx, err := db.Begin()if err != nil {return err}defer func() {if p := recover(); p != nil {tx.Rollback()panic(p) // 重新拋出異常} else if err != nil {tx.Rollback() // 發生錯誤時回滾} else {err = tx.Commit() // 提交事務}}()// 執行事務操作if _, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", amount, from); err != nil {return err}if _, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", amount, to); err != nil {return err}return nil
}

8. 啟用 WAL 模式

在連接字符串中添加?_journal_mode=WAL?參數:

db, err := sql.Open("sqlite3", "./test.db?_journal_mode=WAL")

?SQLite 的 WAL(Write-Ahead Logging)模式是一種替代傳統回滾日志(ROLLBACK JOURNAL)的事務機制,它能顯著提升數據庫的并發性能和寫入吞吐量。

傳統模式(ROLLBACK JOURNAL)
  • 寫操作流程
    1. 將原始數據寫入臨時回滾日志(.db-journal)。
    2. 修改主數據庫文件。
    3. 事務提交后刪除回滾日志。
  • 缺點:寫操作時需對整個數據庫加獨占鎖,導致讀寫互斥,并發性能差。
WAL 模式
  • 寫操作流程
    1. 將修改寫入獨立的 WAL 文件(.db-wal)。
    2. 事務提交時,只需要寫入一個 4 字節的提交標記到 WAL 文件末尾。
    3. 讀取操作直接從主數據庫和 WAL 文件合并后的狀態讀取。
  • 優點:讀寫操作可以并發進行(讀不阻塞寫,寫不阻塞讀)。
讀寫并發
  • WAL 模式允許同時進行讀和寫操作,提升并發性能。
  • 限制:同一時間只能有一個寫事務,但可以有多個并發讀事務。

?

9. 錯誤處理

// 檢查SQL執行結果
result, err := db.Exec("INSERT INTO ...")
if err != nil {log.Fatal(err)
}// 獲取插入ID
id, err := result.LastInsertId()
if err != nil {log.Fatal(err)
}// 獲取受影響行數
rowsAffected, err := result.RowsAffected()
if err != nil {log.Fatal(err)
}

完整示例

package mainimport ("database/sql""fmt""log"_ "github.com/mattn/go-sqlite3"
)func main() {// 連接數據庫db, err := sql.Open("sqlite3", "./test.db")if err != nil {log.Fatal(err)}defer db.Close()// 創建表if err := createTable(db); err != nil {log.Fatal(err)}// 插入數據if err := insertDataWithPrepare(db, "Alice", 30); err != nil {log.Fatal(err)}// 查詢數據users, err := queryAllUsers(db)if err != nil {log.Fatal(err)}fmt.Println("所有用戶:", users)// 更新數據if err := updateUserAge(db, 1, 31); err != nil {log.Fatal(err)}// 刪除數據if err := deleteUser(db, 1); err != nil {log.Fatal(err)}
}

注意事項

  1. 并發限制:SQLite 原生不支持多寫操作,高并發場景需考慮鎖機制或使用其他數據庫。
  2. 文件權限:確保數據庫文件所在目錄可讀寫。
  3. SQL 注入:始終使用預處理語句(Prepare?+?Exec)避免 SQL 注入。

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

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

相關文章

【硬核數學】2.3 AI的“想象力”:概率深度學習與生成模型《從零構建機器學習、深度學習到LLM的數學認知》

歡迎來到本系列的第八篇文章。在前七章中,我們已經構建了一個強大的深度學習工具箱:我們用張量來處理高維數據,用反向傳播來高效地計算梯度,用梯度下降來優化模型參數。我們訓練出的模型在分類、回歸等任務上表現出色。 但它們有…

華為云Flexus+DeepSeek征文|Dify平臺開發搭建口腔牙科24小時在線問診系統(AI知識庫系統)

引言:為什么需要口腔牙科24小時在線問診系統? 在口腔醫療領域,“時間”是患者最敏感的需求之一——深夜牙齒突發疼痛、周末想提前了解治療方案、異地患者無法及時到院……傳統“工作時間在線”的咨詢模式已無法滿足用戶需求。同時&#xff0…

嵌入式硬件中電容的基本原理與詳解

大家好我們今天重討論點知識點如下: 1.電容在電路中的作用 2.用生活中水缸的例子來比喻電容 3.電容存儲能力原理 4.電容封裝的種類介紹電容種類圖片辨識 5.X 電容的作用介紹 6.Y 電容的作用介紹7.鉭電容的優點及特性 7.鉭電容的缺點及特性 8. 鋁電解電容的優點及特性…

中央空調控制系統深度解析:從原理到智能AIOT運維

——附水冷式系統全電路圖解與技術參數 一、中央空調系統架構與技術演進 1. 兩大主流系統對比 技術趨勢:2023年全球冷水機組市場占比達68%(BSRIA數據),其核心優勢在于: - 分區控溫精度:0.5℃&#…

document.write 和 innerHTML、innerText 的區別

document.write 與 innerHTML、innerText 的區別 document.write 直接寫入 HTML 文檔流&#xff0c;若在頁面加載完成后調用會覆蓋整個文檔。常用于動態生成內容&#xff0c;但會破壞現有 DOM 結構&#xff0c;不推薦在現代開發中使用。 document.write("<p>直接寫…

日志分析與實時監控:Elasticsearch在DevOps中的核心作用

引言 在現代DevOps實踐中&#xff0c;日志分析與實時監控是保障系統穩定性與性能的關鍵。Elasticsearch作為分布式搜索與分析引擎&#xff0c;憑借其高效的索引與查詢能力&#xff0c;成為構建日志管理與監控系統的核心組件。本文將深入探討Elasticsearch在DevOps中的應用&…

Unity Catalog 三大升級:Data+AI 時代的統一治理再進化

在剛剛落幕的 2025 Databricks Data AI Summit 上&#xff0c;Databricks 重磅發布了多項 Lakehouse 相關功能更新。其中&#xff0c;面向數據湖治理場景的統一數據訪問與管理方案 —— Unity Catalog&#xff0c;迎來了三大關鍵升級&#xff1a;全面支持 Apache Iceberg、面向…

電容屏觸摸不靈敏及跳點問題分析

在電容屏的使用過程中&#xff0c;觸摸不靈敏和觸點不精準是極為常見且讓人困擾的問題。這些問題不僅影響用戶的操作體驗&#xff0c;在一些對觸摸精度要求較高的場景&#xff0c;如工業控制、繪圖設計等領域&#xff0c;還可能導致嚴重的后果。下面我們就來深入剖析一下這兩個…

小程序學習筆記:導航、刷新、加載、生命周期

在小程序開發的領域中&#xff0c;掌握視圖與邏輯相關的技能是打造功能完備、用戶體驗良好應用的關鍵。今天&#xff0c;咱們就來深入梳理一下小程序視圖與邏輯的學習要點&#xff0c;并結合代碼示例&#xff0c;讓大家有更直觀的理解。 一、頁面之間的導航跳轉 在小程序里實…

生成樹基礎實驗

以太網交換網絡中為了進行鏈路備份&#xff0c;提高網絡可靠性&#xff0c;通常會使用冗余鏈路。但是使用冗余鏈路會在交換網絡上產生環路&#xff0c;引發廣播風暴以及 MAC地址表不穩定等故障現象&#xff0c;從而導致用戶通信質量較差&#xff0c;甚至通信中斷。 為解決交換…

flex布局實例:把色子放進盒子里

目錄 一、flex布局實例&#xff1a;把色子放進盒子里 1、基礎樣式 二、justify-content 屬性 三、flex-direction 屬性 四、align-items 屬性 五、flex-wrap 屬性 二、flex布局應用到常見場景 非常詳細的講解flex布局&#xff0c;看一看&#xff0c;練一練&#xff01; …

Netty編解碼器

目錄 1、概念 2、Netty提供的編解碼器類型 2.1 解碼器 2.1.1 ByteToMessageDecoder 2.1.2 ReplayingDecoder 2.1.3 MessageToMessageDecoder 2.2 編碼器 2.2.1 MessageToByteEncoder 2.2.2 MessageToMessageEncoder 2.3 編解碼器 2.3.1 ByteToMessageCodec 2.3.2 M…

企業內部安全組網技術解析:安全通道選型、零信任架構與數據合規加密防護

一、引言&#xff1a;企業內部安全組網的重要性 隨著企業數字化轉型的深入以及遠程辦公需求的增加&#xff0c;企業內部異地組網逐漸成為企業信息技術部門關注的重要話題。如何在合規合法的前提下&#xff0c;保障企業內部網絡連接的安全性、穩定性&#xff0c;并有效保護企業…

Windows 4625日志類別解析:未成功的賬戶登錄事件

Windows 4625日志類別解析&#xff1a;未成功的賬戶登錄事件 什么是Windows 4625日志&#xff1f; Windows 4625日志屬于安全日志&#xff08;Security Log&#xff09; 的一部分&#xff0c;記錄系統中未成功的賬戶登錄嘗試&#xff08;Failed Logon&#xff09;。它是追蹤非…

3D看房實現房屋的切換

作為3D看房的補充&#xff0c;在這里&#xff0c;我們講一下如何實現房屋的切換&#xff0c;我這里提供兩種思路&#xff0c; 切換貼圖&#xff0c;切換場景&#xff0c; 接下我們按照較復雜的場景切換來講&#xff0c;切換貼圖也就水到渠成&#xff1a; 初始化場景&#xf…

[Android]ANR的線程

ANR的原理是進行了超時告警&#xff0c;在執行一個需要被監控的任務時&#xff0c;注冊一個超時提醒&#xff0c;如果很快執行好了&#xff0c;刪除這個提醒&#xff0c;如果超時&#xff0c;這個提醒就被觸發&#xff0c;這個超時處理是通過handler方式來調用的&#xff0c;這…

RLVR來做Agent任務能力增強訓練

和上一篇其實有點承接 上一篇的爭論其實是因為要優化agent的任務規劃和實現能力的 所以有了self-learning之爭 當我們說Self-learning&#xff0c;其實是在說什么&#xff1f; 其實上一篇最后時候提了一點拿RLVR來做agent的任務提升 正好今天看到了一篇應景的論文&#xf…

如何運營一個開源項目并取得較大影響力?

開源不僅是主要的軟件開發方法論&#xff0c;還是助力快速創新、分散協作、 生態系統建設和職業發展的卓越戰略。如今&#xff0c;無論在哪里&#xff0c;都離不開與 開源的互動。開源存在于你的手機、汽車和冰箱中&#xff0c;它使你最喜歡的節 目或電影的制作和發行成為可能&…

華為高斯數據庫的數據類型

華為高斯數據庫的數據類型 國產數據庫華為高斯的GaussDB的數據類型 華為高斯數據庫的數據類型? 一、數值類型&#xff08;Numeric Types&#xff09;? 二、字符類型&#xff08;Character Types&#xff09;? 三、布爾類型&#xff08;Boolean Type&#xff09;? 四、日期和…

生物實驗室安全、化學品安全

zhihu.com/column/c_1922752541369800632 Docs 目錄 第七章 7.1 實驗室生物安全等級 7.1.1 生物安全基本概念 7.1.2 生物的危害等級 7.1.2.1 國內生物危害等級 7.1.3 實驗室生物安全防護水平分級 7.2 實驗室生物安全控制 7.2.1 實驗室生物儀器設備安全控制 7.2.1.1 生…