Golang中是否有实现sql.DB接口并将数据库存储在文件中的包?

Golang中是否有实现sql.DB接口并将数据库存储在文件中的包? 我正在寻找一个实现了官方 SQL 接口的 Go 包,但能将所有数据存储在单个文件中,因为我不需要高级功能。

pkg.go.dev

sql package - database/sql - Go Packages

Package sql provides a generic interface around SQL (or SQL-like) databases.

它不需要像 SQL 数据库那样需要查询、驱动程序或类似的东西。


更多关于Golang中是否有实现sql.DB接口并将数据库存储在文件中的包?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

那个包的文档在哪里?

更多关于Golang中是否有实现sql.DB接口并将数据库存储在文件中的包?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


如何确认 modernc.org/sqlite 实现了 sql.DB 接口?我乍一看没有发现。

我之前从未发现过这个。看起来是 modernc 的一个分支,并进行了少量修改以使其与 GORM 更兼容:https://github.com/glebarez/go-sqlite/issues/96

pkg.go.dev 上的所有文档都是从解析后的代码以及 Git 仓库(如 GitHub、GitLab 等)中的文件生成的。据我所知,这是一项 Google 服务。如果你有仓库的链接,要找到(参考)文档真的没那么难。或者你指的是别的意思?

据我所知,它是 mattn/go-sqlite3 的直接替代品。 以下是来自 GitLab 仓库的一个简单示例:examples/example1/main.go · master · cznic / sqlite · GitLab

我发现 mattn/go-sqlite3 在某些平台上使用起来很麻烦,因为它需要 cgo。 幸运的是,这个数据库驱动有一个纯 Go 的转换版本:modernc.org/sqlite

很多教程都没有提到这个选项。

以下是 godoc 文档:

https://pkg.go.dev/github.com/glebarez/go-sqlite

我认为它在文档方面比较精简,因为它只是一个 SQL 驱动程序。如果您选择使用这个模块,请查看示例以开始使用:

package main

import (
	"database/sql"
	"fmt"
	"os"
	"path/filepath"

	_ "github.com/glebarez/go-sqlite"
)

func main() {
	if err := main1(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func main1() error {
	dir, err := os.MkdirTemp("", "test-")

是的,有几个实现了 database/sql 接口并将数据存储在单个文件中的 Go 包。以下是两个最常用的选择:

1. SQLite 驱动 (go-sqlite3)

这是最常用的方案,通过 database/sql 接口使用 SQLite:

import (
    "database/sql"
    _ "github.com/mattn/go-sqlite3"
)

func main() {
    // 打开或创建 SQLite 数据库文件
    db, err := sql.Open("sqlite3", "./test.db")
    if err != nil {
        panic(err)
    }
    defer db.Close()

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

    // 插入数据
    _, err = db.Exec("INSERT INTO users (name, email) VALUES (?, ?)", 
        "John Doe", "john@example.com")
    if err != nil {
        panic(err)
    }

    // 查询数据
    rows, err := db.Query("SELECT id, name, email FROM users")
    if err != nil {
        panic(err)
    }
    defer rows.Close()

    for rows.Next() {
        var id int
        var name, email string
        err = rows.Scan(&id, &name, &email)
        if err != nil {
            panic(err)
        }
        fmt.Printf("ID: %d, Name: %s, Email: %s\n", id, name, email)
    }
}

2. Modernc SQLite 驱动

这是一个纯 Go 实现的 SQLite 驱动,不需要 CGO:

import (
    "database/sql"
    _ "modernc.org/sqlite"
)

func main() {
    db, err := sql.Open("sqlite", "./data.db")
    if err != nil {
        panic(err)
    }
    defer db.Close()

    // 使用标准 database/sql 接口操作
    _, err = db.Exec("CREATE TABLE IF NOT EXISTS items (id INTEGER, name TEXT)")
    if err != nil {
        panic(err)
    }
}

3. BoltDB 风格的替代方案

如果你想要更简单的键值存储,可以使用 bbolt

import (
    "database/sql"
    "fmt"
    _ "github.com/etcd-io/bbolt"
)

// 注意:bbolt 需要通过特定的驱动包装器才能实现 sql.DB 接口
// 通常需要自己实现或使用第三方包装

安装命令

# 使用 CGO 的 SQLite 驱动
go get github.com/mattn/go-sqlite3

# 纯 Go 的 SQLite 驱动(无 CGO)
go get modernc.org/sqlite

文件存储示例

两个驱动都会将整个数据库存储在单个文件中:

// SQLite 文件操作示例
db, err := sql.Open("sqlite3", "/path/to/database.db")
// 或
db, err := sql.Open("sqlite", "/path/to/database.db")

// 文件会被自动创建和管理
// 所有表、索引和数据都存储在这个文件中

这两个包都完全实现了 database/sql 接口,支持事务、预处理语句、连接池等标准功能,同时将所有数据存储在单个文件中。

回到顶部