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