Golang中是否有实现sql.DB接口并将数据库存储在文件中的包?
Golang中是否有实现sql.DB接口并将数据库存储在文件中的包? 我正在寻找一个实现了官方 SQL 接口的 Go 包,但能将所有数据存储在单个文件中,因为我不需要高级功能。
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
那个包的文档在哪里?
更多关于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。
我开始使用 GitHub - glebarez/go-sqlite: 用于 Go 的纯 Go SQLite 驱动(嵌入式 SQLite),没想到有这么多选择……
pkg.go.dev 上的所有文档都是从解析后的代码以及 Git 仓库(如 GitHub、GitLab 等)中的文件生成的。据我所知,这是一项 Google 服务。如果你有仓库的链接,要找到(参考)文档真的没那么难。或者你指的是别的意思?
我认为您要找的是 SQLite:
https://www.sqlite.org/index.html
这里有一篇入门文章:
https://astaxie.gitbooks.io/build-web-application-with-golang/content/en/05.3.html
据我所知,它是 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 接口,支持事务、预处理语句、连接池等标准功能,同时将所有数据存储在单个文件中。

