• 封装gorm的CRUD操作


    1、新增

    //新增一条数据
    func CreateEntity(DBExecutor *gorm.DB, entity interface{}) error {
    	if err := DBExecutor.Debug().Create(entity).Error; err != nil {
    		return err
    	}
    	return nil
    }
    //    新增多条数据
    func CreateEntities(DBExecutor *gorm.DB, entities interface{}) error {
    	DBResult := DBExecutor.Create(entities)
    	if err := DBResult.Error; err != nil {
    		return err
    	}
    	return nil
    }
    

    2、删除

    //  删除一条数据
    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
    }
    
    //  删除多条数据
    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、查询

    //    通过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
    }
    
    //    带有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
    }
    

      

    //    查询数目
    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
    }
    

      

    //    带筛选条件查询
    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
    }
    
    //    查询并返回查询到的结果的总数
    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
    }
    

      

    // 关联查询
    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、更新

    //    更新多条数据
    func UpdateEntities(DBExecutor *gorm.DB, entities interface{}) error {
    	result := DBExecutor.Save(entities)
    	if err := result.Error; err != nil {
    		return err
    	}
    	return nil
    }
    

      

    //    更新指定字段
    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
    }
    

      

    //    更新单条数据
    func UpdateEntity(DBExecutor *gorm.DB, entity interface{}) error {
    	result := DBExecutor.Model(entity).Updates(entity)
    	if err := result.Error; err != nil {
    		return err
    	}
    	return nil
    }
    

      

    //    根据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
    }
    

      

    //    查询到结果就返回,否则插入新数据
    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
    }
    

      

    //    数据已存在就更新,否则创建
    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
    }
  • 相关阅读:
    codeforces 940E 思维,dp
    codeforces 469D 2-SAT
    Codeforces 937D dfs
    Educational Codeforces Round 39 (Rated for Div. 2) D dp E 贪心
    Codeforces Round #469 (Div. 2) D 数学递归 E SCC缩点
    Wannafly挑战赛11 D 白兔的字符串 Hash
    Codeforces Round #470 (Div 2) B 数学 C 二分+树状数组 D 字典树
    UVA
    最小生成树(改了两个板子写的)道路建设
    poj1125 基础最短路
  • 原文地址:https://www.cnblogs.com/mango1997/p/16447036.html
Copyright © 2020-2023  润新知