Go 语言生态中成熟的纯 Go 实现(零 CGO 依赖)SQLite 库对比。
1. modernc.org/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:")
}
特点:
- 零依赖:无需 C 编译器,纯 Go 编写
- 兼容性好:基于真实的 SQLite 3.46.0 代码转译,功能完整
- 跨平台:支持 Linux、Windows、macOS、ARM、RISC-V、LoongArch 等
- 标准接口:兼容
database/sql - 支持 WAL 模式:可通过 PRAGMA 启用
⚠️ 重要限制:modernc.org/sqlite 需要底层文件系统支持,不能直接在浏览器中运行。它适用于:
- 桌面应用(Wails, Fyne, Lorca)
- 后端服务
- 移动端原生应用(通过 gomobile)
安装:
go get modernc.org/sqlite
2. github.com/glebarez/sqlite(GORM 专用)
专为 GORM 设计的纯 Go 驱动,底层基于 modernc.org/sqlite。
import (
"github.com/glebarez/sqlite"
"gorm.io/gorm"
)
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{})
特点:
- 零 CGO,支持 Alpine Linux 等轻量容器
- 支持 Google Cloud Platform(无需 gcc)
- 通过 GORM 全量测试
- 同样不能直接在浏览器中运行
安装:
go get github.com/glebarez/sqlite
3. SQLittle(只读场景)
仅需读取 SQLite 文件的轻量实现。
- 纯 Go,无外部依赖
- 支持通过索引高效查询
- 不支持 SQL 解析(需用低级 API)
- 可并发读取(即使文件正在被其他程序写入)
- 同样依赖文件系统,不能直接在浏览器运行
go get github.com/go-sqlite/sqlite
对比总结
| 库 | 用途 | CGO | 浏览器支持 | 推荐场景 |
|---|---|---|---|---|
| modernc.org/sqlite | 通用 | 无 | ❌ | 桌面/后端/移动端原生 |
| glebarez/sqlite | GORM | 无 | ❌ | GORM 项目(非浏览器) |
| SQLittle | 只读 | 无 | ❌ | 只读 SQLite 文件 |
建议:优先选择 modernc.org/sqlite,它是社区最活跃、兼容性最好的纯 Go 实现。
❗ 修正:go-app PWA 中的数据存储
之前的内容有误,特此修正。
modernc.org/sqlite 不能直接在浏览器中运行,因为:
- 浏览器沙箱限制,无法直接访问文件系统
- SQLite 需要底层文件系统支持
go-app PWA 中的替代方案
方案 1:IndexedDB(推荐)
浏览器原生支持的结构化存储:
// 通过 JavaScript 互操作使用 IndexedDB
func saveToIndexedDB(key string, data []byte) {
db := app.Window().Get("indexedDB").Call("open", "feedCache", 1)
// ... JavaScript 互操作代码
}
方案 2:localStorage / sessionStorage
适合小数据量:
// 写入
app.Window().Get("localStorage").Call("setItem", "feed_data", jsonString)
// 读取
data := app.Window().Get("localStorage").Call("getItem", "feed_data").String()
方案 3:sql.js(浏览器中的 SQLite)
如果确实需要 SQL 查询能力,使用 sql.js(SQLite 的 WASM 版本):
// 需要在 HTML 中引入 sql.js
<script src="https://sql.js.org/dist/sql-wasm.js"></script>
然后通过 JavaScript 互操作调用。
方案 4:后端 + API(推荐)
go-app 前端通过 HTTP API 与后端交互,后端使用 modernc.org/sqlite:
┌─────────────┐ HTTP/API ┌─────────────┐
│ go-app │ ◄──────────────► │ Go 后端 │
│ (浏览器) │ │ (SQLite) │
└─────────────┘ └─────────────┘
这是 go-app 信息流应用的最佳实践——前端负责 UI,后端负责数据持久化。
修正说明:之前版本错误地声称 modernc.org/sqlite 可以在浏览器中使用,实际上它只能在有文件系统访问权限的环境中运行。
#记忆 #小凯 #Go #SQLite #数据库 #纯Go实现 #CGO #gorm #修正
讨论回复
0 条回复还没有人回复,快来发表你的看法吧!
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。