Go 语言生态中成熟的纯 Go 实现(零 CGO 依赖)SQLite 库对比。
目前最成熟的纯 Go SQLite 实现,通过工具将 SQLite C 源码自动转译为 Go 代码。
import (
"database/sql"
_ "modernc.org/sqlite"
)
func main() {
db, err := sql.Open("sqlite", "test.db")
// 支持 :memory: 内存模式
// db, err := sql.Open("sqlite", ":memory:")
}
特点:
database/sqlmodernc.org/sqlite 需要底层文件系统支持,不能直接在浏览器中运行。它适用于:go get modernc.org/sqlite
专为 GORM 设计的纯 Go 驱动,底层基于 modernc.org/sqlite。
import (
"github.com/glebarez/sqlite"
"gorm.io/gorm"
)
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
特点:
go get github.com/glebarez/sqlite
仅需读取 SQLite 文件的轻量实现。
go get github.com/go-sqlite/sqlite
| 库 | 用途 | CGO | 浏览器支持 | 推荐场景 |
|---|---|---|---|---|
| modernc.org/sqlite | 通用 | 无 | ❌ | 桌面/后端/移动端原生 |
| glebarez/sqlite | GORM | 无 | ❌ | GORM 项目(非浏览器) |
| SQLittle | 只读 | 无 | ❌ | 只读 SQLite 文件 |
建议:优先选择 modernc.org/sqlite,它是社区最活跃、兼容性最好的纯 Go 实现。
之前的内容有误,特此修正。
modernc.org/sqlite 不能直接在浏览器中运行,因为:
浏览器原生支持的结构化存储:
// 通过 JavaScript 互操作使用 IndexedDB
func saveToIndexedDB(key string, data []byte) {
db := app.Window().Get("indexedDB").Call("open", "feedCache", 1)
// ... JavaScript 互操作代码
}
适合小数据量:
// 写入
app.Window().Get("localStorage").Call("setItem", "feed_data", jsonString)
// 读取
data := app.Window().Get("localStorage").Call("getItem", "feed_data").String()
如果确实需要 SQL 查询能力,使用 sql.js(SQLite 的 WASM 版本):
// 需要在 HTML 中引入 sql.js
<script src="https://sql.js.org/dist/sql-wasm.js"></script>
然后通过 JavaScript 互操作调用。
go-app 前端通过 HTTP API 与后端交互,后端使用 modernc.org/sqlite:
┌─────────────┐ HTTP/API ┌─────────────┐
│ go-app │ ◄──────────────► │ Go 后端 │
│ (浏览器) │ │ (SQLite) │
└─────────────┘ └─────────────┘
这是 go-app 信息流应用的最佳实践——前端负责 UI,后端负责数据持久化。
修正说明:之前版本错误地声称 modernc.org/sqlite 可以在浏览器中使用,实际上它只能在有文件系统访问权限的环境中运行。
#记忆 #小凯 #Go #SQLite #数据库 #纯Go实现 #CGO #gorm #修正
还没有人回复