悠悠楠杉
快速入门:使用Go语言操作SQLite数据库
快速入门:使用Go语言操作SQLite数据库
关键词:Go语言 SQLite 数据库操作 增删改查 轻量级数据库
描述:本文详细介绍如何在Go语言中连接和操作SQLite数据库,包含建表、增删改查等完整示例代码,适合快速上手嵌入式数据库开发。
一、为什么选择SQLite?
SQLite作为轻量级的嵌入式数据库,在Go生态中有着独特的优势。它不需要独立的服务器进程,数据直接存储在单一磁盘文件中,特别适合开发小型应用、移动应用或需要本地存储的场景。与MySQL等大型数据库相比,SQLite的零配置特性让开发者可以更专注于业务逻辑的实现。
二、环境准备
在开始之前,确保已安装:
1. Go 1.16+ 开发环境
2. SQLite3 命令行工具(仅用于调试)
3. 第三方驱动库:github.com/mattn/go-sqlite3
安装驱动:
bash
go get github.com/mattn/go-sqlite3
三、建立数据库连接
go
package main
import (
"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()
// 测试连接
err = db.Ping()
if err != nil {
log.Fatal("数据库连接失败:", err)
}
fmt.Println("成功连接数据库!")
}
四、基础操作实战
1. 创建数据表
go
func createTable(db *sql.DB) {
sqlStmt := CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
_, err := db.Exec(sqlStmt)
if err != nil {
log.Printf("%q: %s\n", err, sqlStmt)
return
}
fmt.Println("表创建成功")
}
2. 插入数据
go
func insertUser(db *sql.DB, name, email string) {
stmt, err := db.Prepare("INSERT INTO users(name, email) VALUES(?, ?)")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
res, err := stmt.Exec(name, email)
if err != nil {
log.Fatal(err)
}
id, _ := res.LastInsertId()
fmt.Printf("插入成功,ID为 %d\n", id)
}
3. 查询数据
go
func queryUsers(db *sql.DB) {
rows, err := db.Query("SELECT id, name, email FROM users")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name, email string
err = rows.Scan(&id, &name, &email)
if err != nil {
log.Fatal(err)
}
fmt.Printf("ID:%d\tName:%s\tEmail:%s\n", id, name, email)
}
}
4. 事务处理
go
func transactionDemo(db *sql.DB) {
tx, err := db.Begin()
if err != nil {
log.Fatal(err)
}
defer func() {
if p := recover(); p != nil {
tx.Rollback()
panic(p)
} else if err != nil {
tx.Rollback()
} else {
err = tx.Commit()
}
}()
_, err = tx.Exec("UPDATE users SET name = ? WHERE id = ?", "张三", 1)
if err != nil {
return
}
fmt.Println("事务执行成功")
}
五、性能优化建议
- 连接池配置:通过
db.SetMaxOpenConns()
设置合理的连接数 - 预处理语句:重用
Prepare
语句减少解析开销 - 批量操作:使用事务处理批量INSERT/UPDATE
- WAL模式:启用Write-Ahead Logging提升并发性能
go db.Exec("PRAGMA journal_mode=WAL;")