Go 语言生态中成熟的**纯 Go 实现**(零 CGO 依赖)SQLite 库对比。
## 1. modernc.org/sqlite ⭐(最推荐)
目前最成熟的纯 Go SQLite 实现,通过工具将 SQLite C 源码自动转译为 Go 代码。
```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)
安装:
```bash
go get modernc.org/sqlite
```
---
## 2. github.com/glebarez/sqlite(GORM 专用)
专为 GORM 设计的纯 Go 驱动,底层基于 `modernc.org/sqlite`。
```go
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 全量测试
- **同样不能直接在浏览器中运行**
安装:
```bash
go get github.com/glebarez/sqlite
```
---
## 3. SQLittle(只读场景)
仅需读取 SQLite 文件的轻量实现。
- 纯 Go,无外部依赖
- 支持通过索引高效查询
- 不支持 SQL 解析(需用低级 API)
- 可并发读取(即使文件正在被其他程序写入)
- **同样依赖文件系统,不能直接在浏览器运行**
```bash
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` 不能直接在浏览器中运行**,因为:
1. 浏览器沙箱限制,无法直接访问文件系统
2. SQLite 需要底层文件系统支持
### go-app PWA 中的替代方案
#### 方案 1:IndexedDB(推荐)
浏览器原生支持的结构化存储:
```go
// 通过 JavaScript 互操作使用 IndexedDB
func saveToIndexedDB(key string, data []byte) {
db := app.Window().Get("indexedDB").Call("open", "feedCache", 1)
// ... JavaScript 互操作代码
}
```
#### 方案 2:localStorage / sessionStorage
适合小数据量:
```go
// 写入
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 版本):
```javascript
// 需要在 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 条回复还没有人回复,快来发表你的看法吧!