diff --git a/app/user/cmd/api/internal/queue/cleanQueryData.go b/app/user/cmd/api/internal/queue/cleanQueryData.go index 85cdc9e..957fb02 100644 --- a/app/user/cmd/api/internal/queue/cleanQueryData.go +++ b/app/user/cmd/api/internal/queue/cleanQueryData.go @@ -28,8 +28,11 @@ func (l *CleanQueryDataHandler) ProcessTask(ctx context.Context, t *asynq.Task) // 计算3天前的时间 threeDaysAgo := time.Now().AddDate(0, 0, -3) - // 调用QueryModel删除3天前的数据 - result, err := l.svcCtx.QueryModel.DeleteBefore(ctx, threeDaysAgo) + // 创建查询条件,排除product_id为4的记录 + conditions := l.svcCtx.QueryModel.SelectBuilder().Where("product_id != ?", 4) + + // 调用QueryModel删除3天前的数据,排除product_id为4的记录 + result, err := l.svcCtx.QueryModel.DeleteBefore(ctx, threeDaysAgo, conditions) if err != nil { logx.Errorf("%s - 清理查询数据失败: %v", time.Now().Format("2006-01-02 15:04:05"), err) return err diff --git a/app/user/model/queryModel.go b/app/user/model/queryModel.go index d7b5aee..f9cf81e 100644 --- a/app/user/model/queryModel.go +++ b/app/user/model/queryModel.go @@ -2,10 +2,11 @@ package model import ( "context" - "fmt" + "strings" "time" "tyc-server/common/globalkey" + "github.com/Masterminds/squirrel" "github.com/zeromicro/go-zero/core/stores/cache" "github.com/zeromicro/go-zero/core/stores/sqlx" ) @@ -17,7 +18,7 @@ type ( // and implement the added methods in customQueryModel. QueryModel interface { queryModel - DeleteBefore(ctx context.Context, before time.Time) (int64, error) + DeleteBefore(ctx context.Context, before time.Time, conditions ...squirrel.SelectBuilder) (int64, error) } customQueryModel struct { @@ -31,13 +32,39 @@ func NewQueryModel(conn sqlx.SqlConn, c cache.CacheConf) QueryModel { defaultQueryModel: newQueryModel(conn, c), } } -func (m *customQueryModel) DeleteBefore(ctx context.Context, before time.Time) (int64, error) { +func (m *customQueryModel) DeleteBefore(ctx context.Context, before time.Time, conditions ...squirrel.SelectBuilder) (int64, error) { var affected int64 = 0 // 使用事务处理批量删除 err := m.defaultQueryModel.Trans(ctx, func(ctx context.Context, session sqlx.Session) error { - query := fmt.Sprintf("DELETE FROM %s WHERE create_time < ? AND del_state = ?", m.defaultQueryModel.table) - result, err := session.ExecCtx(ctx, query, before.Format("2006-01-02 15:04:05"), globalkey.DelStateNo) + // 创建基本的删除条件 + deleteBuilder := squirrel.Delete(m.defaultQueryModel.table). + Where("create_time < ?", before.Format("2006-01-02 15:04:05")). + Where("del_state = ?", globalkey.DelStateNo) + + // 如果提供了额外的查询条件,合并到删除条件中 + if len(conditions) > 0 { + // 获取Where条件 + whereSQL, whereArgs, err := conditions[0].Where("1=0").ToSql() + if err != nil { + return err + } + + // 解析出where子句,去掉"SELECT * FROM xxx WHERE"部分 + whereParts := whereSQL[strings.LastIndex(whereSQL, "WHERE")+6:] + + if len(whereParts) > 0 && len(whereArgs) > 0 { + deleteBuilder = deleteBuilder.Where(whereParts, whereArgs...) + } + } + + // 生成SQL + query, args, err := deleteBuilder.ToSql() + if err != nil { + return err + } + + result, err := session.ExecCtx(ctx, query, args...) if err != nil { return err }