db/README.md

66 lines
2.4 KiB
Markdown
Raw Normal View History

# @go/db
2026-05-03 12:38:33 +08:00
> **Maintainer Statement:** 本项目由 AI 维护。代码源自 github.com/ssgo/db 的重构,支持内存安全防护、读写分离及泛型优化。
## 🎯 设计哲学
`@go/db` 是一个极致精简、意图优先的数据库抽象层。它不试图取代 SQL而是通过智能结果绑定与 SQL 自动化生成,消除数据库操作中的样板代码。
* **智能绑定**根据结果容器类型Struct/Map/Slice/BaseType自动适配查询逻辑无需手动 Scan。
* **内存防御**:集成 `go/safe`,数据库密码在内存中加密存储,使用时物理擦除。
* **读写分离**:内置连接池管理,支持配置多个只读节点实现自动负载均衡。
* **驱动透明**:统一 MySQL、PostgreSQL (pgx) 与 SQLite 的 API 差异。
## 📦 安装
```bash
go get apigo.cc/go/db
```
## 💡 快速开始
```go
import "apigo.cc/go/db"
import _ "apigo.cc/go/db/mysql" // 引入驱动
// 初始化连接
d := db.GetDB("mysql://user:pass@host:3306/dbname", nil)
// 1. 查询全部结果到 Struct 切片
var users []User
d.Query("SELECT * FROM users").To(&users)
// 2. 自动化插入
d.Insert("users", User{Name: "Star", Active: true})
// 3. 事务操作
tx := d.Begin()
tx.Exec("UPDATE balance SET amount = amount - 10 WHERE id = ?", 1)
tx.Commit()
```
## 🛠 API 指南
### 核心对象
- **`GetDB(setting string, logger *log.Logger) *DB`**: 通过 DSN 或配置名获取数据库实例。
- **`DB.Insert/Replace/Update/Delete`**: 自动生成 SQL 并执行,支持 Struct 与 Map。
- **`QueryResult.To(target any)`**: 将查询结果深度映射到目标容器。
- **`QueryResult.MapResults() []map[string]any`**: 快捷获取通用结果集。
### 结果容器适配规则
| 容器类型 | 行为 |
| :--- | :--- |
| `[]Struct` | 返回所有行,按字段名自动映射 |
| `Struct` | 返回第一行,按字段名自动映射 |
| `[]map[string]any` | 返回所有行,保留原始字段名 |
| `[]BaseType` | 返回所有行,仅取第一列 |
| `BaseType` | 返回第一行第一列 |
### 安全与高级特性
- **`SetEncryptKeys(key, iv []byte)`**: 配置全局敏感数据加密密钥。
- **读写分离**: 在 DSN 中配置 `host1,host2,host3`,首个为主库,其余为随机只读库。
- **SQLite 时间修复**: 自动处理 SQLite 毫秒级 `DATETIME` 格式与标准 `time.Time` 的转换。
## 🧪 验证状态
已通过 SQLite 集成测试。详见:[TEST.md](./TEST.md)