当前位置: 首页 > news >正文

gorm高级使用

一、从数据库中随机返回一条数据

  • 1、方式一直接写原生sq

    SELECT*FROM`user`ORDERBYRAND()LIMIT1
  • 2、方式二使用clause.OrderBy来写函数查询

    varuserEntity model.UserEntity err:=dao.UserEntity.UnderlyingDB().WithContext(ctx).Clauses(clause.OrderBy{Expression:clause.Expr{SQL:"RAND()",WithoutParentheses:true},}).Take(&userEntity).Error
  • 3、使用随机函数

    varmaxIDuintdao.UserEntity.WithContext(ctx).Select(dao.UserEntity.ID.Max()).Scan(&maxID)// 生成随机ID(假设ID从1开始连续)ifmaxID>0{randID:=rand.Intn(int(maxID))+1userEntity,err:=dao.UserEntity.WithContext(ctx).Where(dao.UserEntity.ID.Gte(int64(randID))).Take()iferr==nil{utils.Success(ctx,userEntity)return}}

二、 锁的使用

官网文档地址,链接地址,关于锁的使用必须是在事务中使用,否则无效,注意:如果没有使用索引的话会直接升级为表锁

  • 1、关于mysql中表里面锁的几种

    • 行锁,锁定一行数据

      SELECT * FROM user WHERE id = 1 FOR UPDATE;
    • 共享锁,可读不可写

      SELECT * FROM user WHERE id = 1 LOCK IN SHARE MODE;
  • 2、行锁的具体的使用

    u:=dao.UsersEntity user,err:=u.WithContext(ctx).Clauses(clause.Locking{Strength:"UPDATE"}).Where(u.ID.Eq(1)).First()// SELECT * FROM user WHERE id = 1 FOR UPDATE;
  • 3、共享锁的使用

    u:=dao.UsersEntity user,err:=u.WithContext(ctx).Clauses(clause.Locking{Strength:"SHARE"}).Where(u.ID.Eq(1)).First()// SELECT * FROM user WHERE id = 1 LOCK IN SHARE MODE;
  • 4、常见使用(扣减库存的时候)

    err:=db.Transaction(func(tx*gorm.DB)error{p:=query.Product.WithContext(ctx).UseDB(tx)product,err:=p.Clauses(clause.Locking{Strength:"UPDATE"}).Where(p.ID.Eq(productId)).First()iferr!=nil{returnerr}ifproduct.Stock<1{returnerrors.New("库存不足")}_,err=p.Where(p.ID.Eq(productId)).Update(p.Stock,product.Stock-1)returnerr})

三、其他高级使用

  • 1、Upsert操作,指定字段来创建或更新字段,使用场景防止重复数据

    dao.UserEntity.WithContext(ctx).Clauses(clause.OnConflict{Columns:[]clause.Column{{Name:"email"}},DoNothing:true,// 表示什么都不做,}).Create(&model.UserEntity{Email:"1@qq.com",Password:"123456",PassSalt:"123456",})
  • 2、存在的时候就更新指定的字段

    dao.UserEntity.WithContext(ctx).Clauses(clause.OnConflict{Columns:[]clause.Column{{Name:"email"}},DoUpdates:clause.AssignmentColumns([]string{"updated_at"}),// 更新指定字段}).Create(&model.UserEntity{Email:"1@qq.com",Password:"123456",PassSalt:"123456",})
  • 3、存在的时候更新全部的字段

    dao.UserEntity.WithContext(ctx).Clauses(clause.OnConflict{Columns:[]clause.Column{{Name:"email"}},UpdateAll:true,// 表示更新全部的字段}).Create(&model.UserEntity{Email:"1@qq.com",Password:"123456",PassSalt:"123456",})
  • 4、备注说明

    其中根据指定的字段来创建或更新,这个字段必须是唯一索引,如果是多个字段,多个字段一起是唯一索引

四、在gorm-gen中使用普通的sql写法

这种情况是针对于gorm-gen不能满足需求的时候才使用

  • 1、直接使用聚合函数

    varuserList=make([]model.UsersEntity,0)err:=dao.UsersEntity.WithContext(context.Background()).Select(dao.UsersEntity.ID,field.NewUnsafeFieldRaw("COALESCE(NULLIF(TRIM(name), ''), '默认名称') AS name"),field.NewUnsafeFieldRaw("COALESCE(name_id, 1) AS name_id"),).Scan(&userList)
http://www.jsqmd.com/news/583442/

相关文章:

  • 【草稿】 - Harvey
  • 深入探讨COMSOL模拟多相裂隙流中的传质与盐分现象:基质与裂隙控制方程的构建与应用
  • 虚拟同步发电机双机预同步并联仿真的Simulink建模技术及应用
  • 我开发了 3 个 OpenClaw Skill,分享我的设计思路
  • 基于MATLAB平台PCA的人脸识别:开启识别新征程
  • CMMI 能力成熟度模型集成介绍
  • Uniapp H5Builderx 预览Html 显示404问题解决
  • k8s中containerd配置镜像加速
  • 2026年想找本地GEO优化?这里有你要的答案!
  • 基于51单片机的测量仪(电压,电平,频率) 1104-基于51单片机的测量仪(电压,电平
  • 2026年最新TOP3媒体发稿服务商榜单:企业品牌传播选型指南 - 发稿平台推荐
  • 基于YOLOv10深度学习的植物叶片病害识别检测系统(YOLOv10+YOLO数据集+UI界面+Python项目+模型)
  • 第3篇:嵌入式芯片核心架构基础:冯·诺依曼架构与哈佛架构的本质差异与场景适配
  • CST Python接口示例
  • 南麟XT1117 低压差线性LDO稳压器芯片 多种封装形式
  • 驾校招生断崖式下跌?这3个数据驱动的获客策略,让报名量翻倍
  • 2026年深圳冷冻食品包装盒代理,其中商机你知道多少?
  • 解决Python SocketIO客户端连接问题
  • OpenHTMLtoPDF实战:彻底解决JAR包环境中字体加载的NullPointerException问题
  • 余姚加工中心编程培训哪家性价比高
  • 魔方财务批量拉取产品信息教程
  • Dify 工作流/应用中的上下文变量提示
  • 单线程 Redis 的高性能之道
  • ​Problem - 2148F - Codeforces​[字符串后缀排序]
  • ObsPy完整指南:如何用Python快速处理地震数据
  • c++入门:函数实参形参傻傻分不清?如何改变实参!
  • 从火柴盒到AI:探索MENACE的数字化旅程
  • 基于单片机的婴儿看护系统设计
  • GHelper终极指南:用轻量化工具彻底替代Armoury Crate,释放华硕ROG笔记本全部性能!
  • 全双工和半双工的区别