封装gorm的CRUD操作
1、新增
1 2 3 4 5 6 7 | //新增一条数据 func CreateEntity(DBExecutor *gorm.DB, entity interface {}) error { if err := DBExecutor.Debug().Create(entity).Error; err != nil { return err } return nil } |
1 2 3 4 5 6 7 8 | // 新增多条数据 func CreateEntities(DBExecutor *gorm.DB, entities interface {}) error { DBResult := DBExecutor.Create(entities) if err := DBResult.Error; err != nil { return err } return nil } |
2、删除
1 2 3 4 5 6 7 8 | // 删除一条数据 func DeleteEntity(DBExecutor *gorm.DB, entity interface {}) (int64, error) { DBResult := DBExecutor.Unscoped().Where(entity).Delete(entity) if err := DBResult.Error; err != nil { return 0, err } return DBResult.RowsAffected, nil } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 删除多条数据 func DeleteEntities(DBExecutor *gorm.DB, filter * map [string] interface {}, entity interface {}) (int64, error) { query := DBExecutor.Unscoped() if filter != nil { for key, value := range *filter { switch { case strings.HasSuffix(key, "IN" ): query = query.Where(key+ " (?)" , value) default : query = query.Where(key+ " = ?" , value) } } } result := query.Debug().Delete(entity) return result.RowsAffected, result.Error } |
3、查询
1 2 3 4 5 6 7 8 | // 通过ID查询 func QueryEntity(entityID interface {}, entity interface {}) error { result := DB.Where( "ID = ?" , entityID).First(entity) if result.RowsAffected < 1 { return errors.New( "查询结果为空" ) } return result.Error } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 带有group、order、where筛选条件的查询 func QueryEntityByFilter(filter * map [string] interface {}, entity interface {}) error { // 不存在时,不会返回错误 query := DB.Select( "*" ) if filter != nil { for key, value := range *filter { if key == "order" { query = query.Order(value) } else if key == "group" { query = query.Group(value.(string)) } else { query = query.Where(key+ " = ?" , value) } } } result := query.Find(entity) return result.Error } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | // 查询数目 func QueryCount(params * map [string] interface {}, list interface {}, count *int64) error { query := DB if params != nil { for key, value := range *params { switch { case strings.HasSuffix(key, "IN" ): query = query.Where(key+ " (?)" , value) case key == "distinct" : query = query.Distinct(value) case strings.HasSuffix(key, "!=" ): if value == "" { query = query.Where(key + " ''" ) } else if value == 0 { query = query.Where(key + " 0" ) } else { query = query.Where(key, value) } default : query = query.Where(key+ " = ?" , value) } } } if err := query.Find(list).Count(count).Error; err != nil { return err } return nil } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | // 带筛选条件查询 func QueryList(params * map [string] interface {}, list interface {}) error { query := DB.Debug() if params != nil { for key, value := range *params { switch { case key == "select" : valueStr := "" flagStr := "" for _, v := range value.([]string) { valueStr = valueStr + flagStr + v flagStr = " " } query = query.Select(valueStr) case key == "table" : query = query.Table(value.(string)) case key == "distinct" : query = query.Distinct(value) case key == "order" : query = query.Order(value) case key == "limit" : query = query.Limit(value.(int)) case key == "offset" : query = query.Offset(value.(int)) case strings.HasSuffix(key, "IN" ): query = query.Where(key+ " (?)" , value) case strings.HasSuffix(key, "!=" ): if value == "" { query = query.Where(key + " ''" ) } else if value == 0 { query = query.Where(key + " 0" ) } else { query = query.Where(key, value) } case strings.HasSuffix(key, "?" ): query = query.Where(key, value) case strings.HasSuffix(key, "LIKE" ): query = query.Where(key+ " ?" , "%" +value.(string)+ "%" ) case strings.Index(key, "LIKE" ) != -1: queryInfo := strings.SplitN(value.(string), " " , 2) query = query.Where(queryInfo[0]+ " LIKE ?" , "%" +queryInfo[1]+ "%" ) case strings.HasSuffix(key, "BETWEEN" ): values := strings.Split(value.(string), "," ) query = query.Where(key+ "? AND ?" , values[0], values[1]) default : query = query.Where(key+ " = ?" , value) } } } if err := query.Find(list).Error; err != nil { return err } return nil } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | // 查询并返回查询到的结果的总数 func QueryListReturnNumber(params * map [string] interface {}, list interface {}) (int64, error) { var total int64 query := DB if params != nil { for key, value := range *params { switch { case key == "select" : valueStr := "" flagStr := "" for _, v := range value.([]string) { valueStr = valueStr + flagStr + v flagStr = "," } query = query.Select(valueStr) case key == "distinct" : query = query.Distinct(value) case key == "order" : query = query.Order(value) case key == "limit" : continue // query = query.Limit(value.(int)) case key == "offset" : continue // query = query.Offset(value.(int)) case key == "time" : query = query.Where( "created_at >= ? AND created_at <= ?" , value.([]time.Time)[0], value.([]time.Time)[1]) case key == "data_time" : query = query.Where( "data_time >= ? AND data_time <= ?" , value.([]time.Time)[0], value.([]time.Time)[1]) case strings.Index(key, "LIKE" ) != -1: queryInfo := strings.Split(value.(string), " " ) query = query.Where(queryInfo[0]+ " LIKE ?" , "%" +queryInfo[1]+ "%" ) case strings.HasSuffix(key, "BETWEEN" ): values := strings.Split(value.(string), "," ) query = query.Where( "? between ? AND ?" , values[0], values[1], values[2]) case strings.HasSuffix(key, "?" ): query = query.Where(key, value) case strings.HasSuffix(key, "IN" ): query = query.Where(key+ " (?)" , value) default : query = query.Where(key+ " = ?" , value) } } // 这里为了获取分页前结果的总个数,给前端计算页数使用 total = query.Find(list).RowsAffected for key, value := range *params { if key == "limit" { query = query.Limit(value.(int)) } else if key == "offset" { query = query.Offset(value.(int)) } else { continue } } } if err := query.Debug().Find(list).Error; err != nil { return 0, err } return total, nil } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // 关联查询 type result struct { dal.Comment User1Name string `json: "user1_name" ` User2Name string `json: "user2_name" ` } var res []*result err = dal.DB.Table( "comments" ).Select( "comments.*,u1.name as user1_name,u2.name as user2_name" ). Joins( "left join users as u1 on u1.id = comments.user1_id" ). Joins( "left join users as u2 on u2.id = comments.user2_id" ). Where( "comments.user1_id = ? or comments.user2_id = ?" ,int(m[ "user_id" ].(float64)),int(m[ "user_id" ].(float64))). Where( "comments.status = 2" ). Scan(&res).Error if err!=nil{ log.Printf( "get comment error:unit not exist:%v" , err) c.JSON(404, gin.H{ "message" : "comment not exist" , }) return } |
4、更新
1 2 3 4 5 6 7 8 | // 更新多条数据 func UpdateEntities(DBExecutor *gorm.DB, entities interface {}) error { result := DBExecutor.Save(entities) if err := result.Error; err != nil { return err } return nil } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // 更新指定字段 func UpdateFields(DBExecutor *gorm.DB, model interface {}, selector * map [string] interface {}, fields * map [string] interface {}) error { query := DBExecutor.Model(&model) if selector != nil { for key, value := range *selector { switch { case key == "order" : case strings.HasSuffix(key, "IN" ): query = query.Where(key+ " (?)" , value) default : query = query.Where(key+ " = ?" , value) } } } result := query.Updates(fields) if err := result.Error; err != nil { return err } return nil } |
1 2 3 4 5 6 7 8 | // 更新单条数据 func UpdateEntity(DBExecutor *gorm.DB, entity interface {}) error { result := DBExecutor.Model(entity).Updates(entity) if err := result.Error; err != nil { return err } return nil } |
1 2 3 4 5 6 7 8 | // 根据ID筛选更新数据 func UpdateEntityByID(DBExecutor *gorm.DB, ID uint, entity interface {}) error { result := DBExecutor.Model(entity).Where( "id = ?" , ID).Updates(entity) if err := result.Error; err != nil { return err } return nil } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 查询到结果就返回,否则插入新数据 func GetOrCreate(DBExecutor *gorm.DB, entity interface {}) (int64, error) { // 返回的int, 表示查询到的个数, 0则代表查询无果,创建之 result := DBExecutor.Where(entity).Limit(1).Find(entity) if err = result.Error; err != nil { return 0, err } if result.RowsAffected == 0 { err = CreateEntity(DBExecutor, entity) if err != nil { return 0, err } return 0, nil } return result.RowsAffected, nil } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 数据已存在就更新,否则创建 func UpdateOrCreate(DBExecutor *gorm.DB, entity interface {}) error { result := DBExecutor.Where(entity).Limit(1).Find(entity) if err = result.Error; err != nil { return err } if result.RowsAffected == 0 { err = CreateEntity(DBExecutor, entity) if err != nil { return err } } else if result.RowsAffected == 1 { result = DBExecutor.Model(entity).Updates(entity) if err := result.Error; err != nil { return err } } return nil } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码