171 lines
3.5 KiB
Markdown
171 lines
3.5 KiB
Markdown
# 重构说明
|
|
|
|
## 重构内容
|
|
|
|
本次重构将项目从原生SQL和time.Ticker改为使用更现代化的库:
|
|
|
|
### 1. 定时任务调度器
|
|
|
|
**之前**: 使用 `time.Ticker`
|
|
```go
|
|
ticker := time.NewTicker(time.Duration(interval) * time.Second)
|
|
defer ticker.Stop()
|
|
|
|
for {
|
|
select {
|
|
case <-ticker.C:
|
|
runCollection(coll, store)
|
|
case <-quit:
|
|
return
|
|
}
|
|
}
|
|
```
|
|
|
|
**现在**: 使用 `github.com/robfig/cron/v3`
|
|
```go
|
|
c := cron.New(cron.WithSeconds())
|
|
cronSpec := fmt.Sprintf("@every %ds", interval)
|
|
|
|
_, err = c.AddFunc(cronSpec, func() {
|
|
runCollection(coll, store)
|
|
})
|
|
|
|
c.Start()
|
|
// ...
|
|
c.Stop()
|
|
```
|
|
|
|
**优势**:
|
|
- 支持标准的cron表达式,更灵活
|
|
- 可以配置多个不同频率的任务
|
|
- 更好的任务管理和控制
|
|
- 支持秒级精度
|
|
|
|
### 2. 数据库ORM
|
|
|
|
**之前**: 使用原生 `database/sql` + `github.com/lib/pq`
|
|
```go
|
|
db, err := sql.Open("postgres", connStr)
|
|
_, err := s.db.Exec(query, params...)
|
|
tx, err := s.db.Begin()
|
|
stmt, err := tx.Prepare(query)
|
|
```
|
|
|
|
**现在**: 使用 `GORM`
|
|
```go
|
|
db, err := gorm.Open(postgres.Open(connStr), &gorm.Config{})
|
|
tx.Create(&model)
|
|
tx.CreateInBatches(models, 100)
|
|
db.AutoMigrate(&models.Model{})
|
|
```
|
|
|
|
**优势**:
|
|
- 自动数据库表结构迁移
|
|
- 面向对象的操作方式
|
|
- 批量插入优化
|
|
- 自动管理连接池
|
|
- 更好的类型安全
|
|
- 支持软删除
|
|
- 链式调用,代码更简洁
|
|
|
|
## 主要变化
|
|
|
|
### 文件变化
|
|
|
|
1. **models/models.go**
|
|
- 添加GORM标签
|
|
- 添加DeletedAt字段支持软删除
|
|
- ID类型从int改为uint
|
|
|
|
2. **storage/storage.go**
|
|
- 完全重写,使用GORM
|
|
- 添加AutoMigrate方法
|
|
- 简化事务处理
|
|
- 使用CreateInBatches批量插入
|
|
|
|
3. **cmd/main.go**
|
|
- 使用cron替代time.Ticker
|
|
- 添加AutoMigrate调用
|
|
- 更优雅的启动和停止流程
|
|
|
|
4. **go.mod**
|
|
- 移除: github.com/lib/pq (由GORM驱动替代)
|
|
- 新增: github.com/robfig/cron/v3
|
|
- 新增: gorm.io/gorm
|
|
- 新增: gorm.io/driver/postgres
|
|
|
|
### 数据库变化
|
|
|
|
**之前**: 需要手动执行 `scripts/schema.sql` 创建表
|
|
|
|
**现在**: 程序启动时自动创建和迁移表结构
|
|
|
|
## 兼容性说明
|
|
|
|
### API兼容
|
|
- 外部接口保持不变
|
|
- 环境变量配置保持不变
|
|
- 数据结构保持不变
|
|
|
|
### 数据库兼容
|
|
- 表结构与原设计完全一致
|
|
- 字段类型和索引保持一致
|
|
- 可以直接在原有数据库上运行(会保留已有数据)
|
|
|
|
## 升级步骤
|
|
|
|
1. 备份现有数据库(可选,但推荐)
|
|
```bash
|
|
pg_dump -U user -d qmt_db > backup.sql
|
|
```
|
|
|
|
2. 更新依赖
|
|
```bash
|
|
go mod tidy
|
|
```
|
|
|
|
3. 重新编译
|
|
```bash
|
|
go build -o collector.exe cmd/main.go
|
|
```
|
|
|
|
4. 运行新程序
|
|
```bash
|
|
./collector.exe
|
|
```
|
|
|
|
程序会自动检测并迁移数据库表结构。
|
|
|
|
## 性能对比
|
|
|
|
### 定时任务
|
|
- **time.Ticker**: 简单场景足够,但功能有限
|
|
- **cron**: 功能强大,支持复杂调度,性能相当
|
|
|
|
### 数据库操作
|
|
- **原生SQL**: 性能略高,但开发效率低
|
|
- **GORM**: 开发效率高,批量插入性能优秀,适合本项目
|
|
|
|
对于本项目的数据采集场景,GORM的性能完全足够,且大大提升了开发效率和代码可维护性。
|
|
|
|
## 测试
|
|
|
|
所有单元测试已通过:
|
|
```bash
|
|
go test ./collector -v
|
|
```
|
|
|
|
编译成功:
|
|
```bash
|
|
go build -o collector.exe cmd/main.go
|
|
```
|
|
|
|
## 总结
|
|
|
|
本次重构在不改变功能的前提下,使用了更现代化、更易维护的技术栈:
|
|
- ✅ 更灵活的定时任务调度
|
|
- ✅ 更简洁的数据库操作
|
|
- ✅ 自动表结构管理
|
|
- ✅ 更好的代码可读性和可维护性
|
|
- ✅ 保持向后兼容
|