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 生…