当前位置: 首页 > news >正文

Go语言SQLite轻量级数据库应用

Go语言SQLite轻量级数据库应用

引言

SQLite是一款轻量级的嵌入式数据库,无需独立服务进程,非常适合单机应用、移动端应用和开发测试环境。Go语言通过database/sql包配合go-sqlite3驱动可以方便地操作SQLite数据库。本文将深入探讨Go语言中SQLite的使用技巧和最佳实践。

一、环境配置与连接

1.1 安装依赖

go get github.com/mattn/go-sqlite3

1.2 基本连接配置

package main import ( "database/sql" "fmt" "log" _ "github.com/mattn/go-sqlite3" ) func main() { // 连接SQLite数据库 // 文件不存在时会自动创建 db, err := sql.Open("sqlite3", "./example.db") if err != nil { log.Fatalf("Failed to open database: %v", err) } defer db.Close() // 验证连接 if err := db.Ping(); err != nil { log.Fatalf("Failed to ping database: %v", err) } fmt.Println("Successfully connected to SQLite database") }

二、数据库初始化

2.1 创建表结构

func InitializeDatabase(db *sql.DB) error { createUsersTable := ` CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, age INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ` _, err := db.Exec(createUsersTable) if err != nil { return err } createPostsTable := ` CREATE TABLE IF NOT EXISTS posts ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, title TEXT NOT NULL, content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ); ` _, err = db.Exec(createPostsTable) if err != nil { return err } // 创建索引 _, err = db.Exec("CREATE INDEX IF NOT EXISTS idx_posts_user_id ON posts(user_id);") return err }

三、CRUD操作

3.1 插入数据

type User struct { ID int Name string Email string Age int CreatedAt string } func InsertUser(db *sql.DB, name, email string, age int) (int64, error) { query := ` INSERT INTO users (name, email, age) VALUES (?, ?, ?) ` result, err := db.Exec(query, name, email, age) if err != nil { return 0, err } id, err := result.LastInsertId() if err != nil { return 0, err } return id, nil }

3.2 查询数据

func GetUserByID(db *sql.DB, id int) (*User, error) { query := "SELECT id, name, email, age, created_at FROM users WHERE id = ?" var user User err := db.QueryRow(query, id).Scan(&user.ID, &user.Name, &user.Email, &user.Age, &user.CreatedAt) if err != nil { if err == sql.ErrNoRows { return nil, nil } return nil, err } return &user, nil } func GetUsersByAge(db *sql.DB, minAge int) ([]*User, error) { query := "SELECT id, name, email, age, created_at FROM users WHERE age >= ? ORDER BY age DESC" rows, err := db.Query(query, minAge) if err != nil { return nil, err } defer rows.Close() var users []*User for rows.Next() { var user User if err := rows.Scan(&user.ID, &user.Name, &user.Email, &user.Age, &user.CreatedAt); err != nil { return nil, err } users = append(users, &user) } return users, nil }

3.3 更新数据

func UpdateUser(db *sql.DB, id int, name, email string) (int64, error) { query := ` UPDATE users SET name = ?, email = ? WHERE id = ? ` result, err := db.Exec(query, name, email, id) if err != nil { return 0, err } rowsAffected, err := result.RowsAffected() if err != nil { return 0, err } return rowsAffected, nil }

3.4 删除数据

func DeleteUser(db *sql.DB, id int) (int64, error) { query := "DELETE FROM users WHERE id = ?" result, err := db.Exec(query, id) if err != nil { return 0, err } rowsAffected, err := result.RowsAffected() if err != nil { return 0, err } return rowsAffected, nil }

四、事务处理

func TransferPoints(db *sql.DB, fromID, toID int, points int) error { tx, err := db.Begin() if err != nil { return err } defer tx.Rollback() // 扣除积分 _, err = tx.Exec("UPDATE users SET points = points - ? WHERE id = ?", points, fromID) if err != nil { return err } // 增加积分 _, err = tx.Exec("UPDATE users SET points = points + ? WHERE id = ?", points, toID) if err != nil { return err } // 记录日志 _, err = tx.Exec("INSERT INTO transactions (from_id, to_id, points) VALUES (?, ?, ?)", fromID, toID, points) if err != nil { return err } return tx.Commit() }

五、高级查询

5.1 连接查询

func GetUserPosts(db *sql.DB, userID int) ([]map[string]interface{}, error) { query := ` SELECT u.name, p.title, p.content, p.created_at FROM users u JOIN posts p ON u.id = p.user_id WHERE u.id = ? ORDER BY p.created_at DESC ` rows, err := db.Query(query, userID) if err != nil { return nil, err } defer rows.Close() var results []map[string]interface{} for rows.Next() { var name, title, content, createdAt string if err := rows.Scan(&name, &title, &content, &createdAt); err != nil { return nil, err } results = append(results, map[string]interface{}{ "user_name": name, "post_title": title, "content": content, "created_at": createdAt, }) } return results, nil }

5.2 聚合查询

func GetUserStats(db *sql.DB) ([]map[string]interface{}, error) { query := ` SELECT COUNT(*) as total_users, AVG(age) as avg_age, MIN(age) as min_age, MAX(age) as max_age FROM users ` rows, err := db.Query(query) if err != nil { return nil, err } defer rows.Close() var results []map[string]interface{} for rows.Next() { var totalUsers, minAge, maxAge int var avgAge float64 if err := rows.Scan(&totalUsers, &avgAge, &minAge, &maxAge); err != nil { return nil, err } results = append(results, map[string]interface{}{ "total_users": totalUsers, "avg_age": avgAge, "min_age": minAge, "max_age": maxAge, }) } return results, nil }

六、批量操作

func BatchInsertUsers(db *sql.DB, users []*User) error { tx, err := db.Begin() if err != nil { return err } defer tx.Rollback() stmt, err := tx.Prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)") if err != nil { return err } defer stmt.Close() for _, user := range users { _, err := stmt.Exec(user.Name, user.Email, user.Age) if err != nil { return err } } return tx.Commit() }

七、数据库备份与恢复

7.1 备份数据库

func BackupDatabase(db *sql.DB, backupPath string) error { query := fmt.Sprintf("BACKUP TO '%s'", backupPath) _, err := db.Exec(query) return err }

7.2 恢复数据库

func RestoreDatabase(backupPath string) (*sql.DB, error) { db, err := sql.Open("sqlite3", backupPath) if err != nil { return nil, err } if err := db.Ping(); err != nil { db.Close() return nil, err } return db, nil }

八、性能优化

8.1 连接池配置

func ConfigureConnectionPool(db *sql.DB) { db.SetMaxOpenConns(1) // SQLite是文件数据库,单连接足够 db.SetMaxIdleConns(1) db.SetConnMaxLifetime(0) }

8.2 预编译语句

func PrepareStatements(db *sql.DB) (*sql.Stmt, *sql.Stmt, error) { insertStmt, err := db.Prepare("INSERT INTO users (name, email) VALUES (?, ?)") if err != nil { return nil, nil, err } queryStmt, err := db.Prepare("SELECT * FROM users WHERE id = ?") if err != nil { insertStmt.Close() return nil, nil, err } return insertStmt, queryStmt, nil }

结语

SQLite作为轻量级数据库,与Go语言的结合非常适合开发单机应用、测试环境和嵌入式系统。通过合理使用事务、预编译语句和索引,可以构建高效、可靠的SQLite应用。希望本文的实践经验能帮助你更好地使用Go语言与SQLite进行开发。

http://www.jsqmd.com/news/880256/

相关文章:

  • 降AI率黑科技!AI率92%暴降至5%!实测10款AI智能降重工具!薅羊毛技巧!
  • 为什么你的Gemini总生成错误JOIN?深度拆解语义理解断层、外键缺失与上下文截断三大黑洞
  • 人车一体化跨镜追踪 矿井运输车辆通行轨迹智能管控技术白皮书
  • 今日算法(组合问题III)(回溯的使用)
  • 2026最新免费在线去除视频水印保姆级教程,不用下载软件一步到位!
  • Go语言ORM框架GORM深度解析
  • 2026最新免费在线去水印工具详细教程,在线去本地视频水印保姆级指南
  • 哈夫曼树:高效压缩数据的秘密武器
  • 蛋白质设计新范式:QUBO建模与迭代学习框架解析
  • 2026深度测评10款降AIGC工具红黑榜!优缺点全公开,达标率硬刚行业巅峰
  • 风暴崛起 Tempest Rising修改器2026官方正版最新版pc免费下载(看到请立即转存 资源随时失效)
  • 别再盲目调max_tokens!资深架构师压测23种分块策略后,锁定最优chunk_size=384+overlap=64的硬核依据
  • 宝藏合集!2026一键生成论文工具大盘点(覆盖 99% 论文写作需求)
  • 2026保姆级免费照片去水印教程:不用下载App,微信小程序3步搞定!
  • Windows视觉效果关不关?电脑卡顿这样优化最快
  • 技术人的职业规划:打造成功的职业生涯
  • Gemini LTV建模实战手册:从POC验证、规模化推理、监管审计到知识沉淀——覆盖7大关键节点的稀缺性价值锚定法
  • 【ChatGPT新闻稿写作黄金模板】:20年公关总监亲授——5大结构+3类风险规避+1套即用话术库
  • 技术人的沟通技巧:如何与非技术人员有效沟通
  • DeepSeek模型版本选择终极决策树(2024Q3权威更新):输入你的GPU型号/任务类型/预算,3步锁定最优解
  • 2026Q2上海老房翻新装修公司TOP5排行榜|业主实测高口碑旧房改造实力榜单 - 品牌智鉴榜
  • 鸿蒙健身计划页面构建:一周训练表、营养目标、近期打卡与训练提示模块详解
  • 仅剩72小时!OpenAI即将关闭旧版Prompt调试接口:立即掌握新一代结构化提示词(JSON Schema+Role-Chain双范式)
  • Gemini能替代初级开发者吗?:2024最新实测数据揭示代码生成准确率、可维护性与安全边界
  • 【DeepSeek生产环境性能崩塌预警】:7类高频OOM错误代码级定位图谱(含torch.compile失效的3个隐藏触发条件)
  • HTML 基础:列表、表格与多媒体元素
  • 丈母娘只要第一眼看不上女婿,即使后面结婚了,大概率也会一直看不上,大家觉得对吗?——为什么有些丈母娘总是挑女婿的不是,没事就发货大吼?——
  • 鸿蒙PC:Qt适配OpenHarmony实战【花账】:从一笔支出开始,做一个本地记账小应用
  • 云原生事件驱动架构:构建高效的事件处理系统
  • AGC013 部分题目题解