db/README.md

66 lines
2.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# @go/db
> **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)