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

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

Go语言SQLite轻量级数据库应用引言SQLite是一款轻量级的嵌入式数据库无需独立服务进程非常适合单机应用、移动端应用和开发测试环境。Go语言通过database/sql包配合go-sqlite3驱动可以方便地操作SQLite数据库。本文将深入探讨Go语言中SQLite的使用技巧和最佳实践。一、环境配置与连接1.1 安装依赖go get github.com/mattn/go-sqlite31.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.zskr.cn/news/1372724.html

相关文章:

  • 【DeepSeek生产环境性能崩塌预警】:7类高频OOM错误代码级定位图谱(含torch.compile失效的3个隐藏触发条件)
  • Windows视觉效果关不关?电脑卡顿这样优化最快
  • 2026最新免费在线去除视频水印保姆级教程,不用下载软件一步到位!
  • 2026保姆级教程:免费一键去图片水印的App有哪些?这几种方法一看就会
  • Hive基础入门篇
  • 基于Multi-Agent的面试模拟系统设计与实现
  • 论文榨汁机 · 用 Multi-Agent 对话框架榨干每一篇论文
  • K210开发板固件烧录:使用kflash_gui图形化工具的完整指南
  • 云原生事件驱动架构:构建高效的事件处理系统
  • 技术人的职业规划:打造成功的职业生涯
  • 高危工区跨镜行为追踪 违章操作实时识别联动告警技术白皮书
  • 井下多巷道跨镜连续追踪 外来入井人员全程行踪监管技术白皮书
  • 创业团队如何管理远程工作
  • 鸿蒙PC:Qt适配OpenHarmony实战【烟火菜单】:做一个三栏式本地菜谱手册
  • Gemini LTV建模实战手册:从POC验证、规模化推理、监管审计到知识沉淀——覆盖7大关键节点的稀缺性价值锚定法
  • 蛋白质设计新范式:QUBO建模与迭代学习框架解析
  • 为什么你的Gemini总生成错误JOIN?深度拆解语义理解断层、外键缺失与上下文截断三大黑洞
  • 宝藏合集!2026一键生成论文工具大盘点(覆盖 99% 论文写作需求)
  • iOS抓包防护绕过:合规调试的三层穿透实践
  • 别再盲目调max_tokens!资深架构师压测23种分块策略后,锁定最优chunk_size=384+overlap=64的硬核依据
  • Legacy iOS Kit深度拆解:揭秘旧款iOS设备重生的技术魔法
  • 鸿蒙PC:Qt适配OpenHarmony实战【花账】:从一笔支出开始,做一个本地记账小应用
  • 支付即开票·自助开票·阿雪心学·无相无界(12)—东方仙盟
  • 我突然发现了一个道理,这个什么烂人都有,哪怕你随便说句没啥贬低的中性的话,人家也可以给你找出话来说你,你说这个社会搞笑不?这就是社会大了,什么鸟人都有的缘故了
  • 有些女的就是只配孤独终老,一说话就伤人,我觉得没有必要相处,没必要去改变一些人,林子大了,什么鸟都有。。。——拉开距离,减少纠缠,建立边界,降低期待
  • 开发商必看:2026年房地产数字沙盘头部服务商综合实力排行榜
  • 数字沙盘要花多少钱?2026年房地产电子沙盘价格全解析
  • 创建全0矩阵和全1矩阵
  • 创建随机矩阵
  • 苹果底层的技术实力 软硬件一体