Golang集成SQLite数据库方案

最近在学习Golang开发,想在自己的项目里集成SQLite数据库,但不知道有哪些成熟的方案。请问大家常用的Golang SQLite驱动有哪些推荐?需要注意哪些性能优化和并发问题?有没有比较完整的集成示例可以参考?

2 回复

推荐使用database/sql配合github.com/mattn/go-sqlite3驱动。
安装:go get github.com/mattn/go-sqlite3
示例代码:

import (
    "database/sql"
    _ "github.com/mattn/go-sqlite3"
)
db, err := sql.Open("sqlite3", "./test.db")

轻量高效,适合嵌入式或小型项目。

更多关于Golang集成SQLite数据库方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中集成SQLite数据库,推荐使用modernc.org/sqlite驱动,这是纯Go实现的SQLite驱动,无需CGO依赖,跨平台兼容性好。

安装依赖

go get modernc.org/sqlite

基础使用示例

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "modernc.org/sqlite"
)

func main() {
    // 打开数据库连接
    db, err := sql.Open("sqlite", "test.db")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // 创建表
    _, err = db.Exec(`
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            email TEXT UNIQUE NOT NULL
        )
    `)
    if err != nil {
        log.Fatal(err)
    }

    // 插入数据
    result, err := db.Exec(
        "INSERT INTO users (name, email) VALUES (?, ?)",
        "张三", "zhangsan@example.com",
    )
    if err != nil {
        log.Fatal(err)
    }

    id, _ := result.LastInsertId()
    fmt.Printf("插入成功,ID: %d\n", id)

    // 查询数据
    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, Name: %s, Email: %s\n", id, name, email)
    }
}

连接池配置

db.SetMaxOpenConns(1)  // SQLite是文件级锁,建议设置为1
db.SetMaxIdleConns(1)
db.SetConnMaxLifetime(0)

事务处理

func transferMoney(db *sql.DB, from, to int, amount float64) error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }
    defer tx.Rollback()

    // 执行多个操作
    _, err = tx.Exec("UPDATE accounts SET balance = balance - ? WHERE id = ?", amount, from)
    if err != nil {
        return err
    }

    _, err = tx.Exec("UPDATE accounts SET balance = balance + ? WHERE id = ?", amount, to)
    if err != nil {
        return err
    }

    return tx.Commit()
}

优势特点

  1. 无CGO依赖:纯Go实现,交叉编译简单
  2. 轻量级:单个文件数据库,适合嵌入式场景
  3. 事务支持:完整的ACID事务
  4. 零配置:开箱即用,无需额外安装

这种方案适合中小型项目、原型开发和嵌入式系统等场景。

回到顶部