news 2026/6/22 10:04:17

go gorm expr

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go gorm expr

`gorm.Expr` 相当于在 GORM 里开一个“原生 SQL 小窗口”,用来写任意(带占位符的)SQL 表达式,让数据库自己去计算,而不是先查出来再在 Go 代码里算完再写回去。典型用途分三类:

1. 原子更新(避免并发读-改-写)

```go
// 库存 -1
db.Model(&Product{}).
Where("id = ? AND stock > 0", pid).
Update("stock", gorm.Expr("stock - ?", 1))

// 乐观锁版本号 +1
db.Model(&User{ID: 1}).Update("lock_version", gorm.Expr("lock_version + 1"))
```

2. 把表达式当“值”用在 Upsert / Returning 里

```go
// upsert 时只在价格真正变化才更新,并返回被影响的行
db.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "sku"}},
DoUpdates: clause.Assignments(map[string]interface{}{
"price": gorm.Expr("GREATEST(price, VALUES(price))"),
}),
}, clause.Returning{}).Create(&products)
```

3. 复杂 WHERE / ORDER 子句

```go
// 按 FIELD 顺序排序
db.Clauses(clause.OrderBy{
Expression: clause.Expr{
SQL: "FIELD(id, ?)",
Vars: []interface{}{[]int{3, 1, 2}},
WithoutParentheses: true,
},
}).Find(&users)

// jsonb 嵌套字段更新
db.Model(&Quiz{}).Where("id = ?", 1).
Update("answers", gorm.Expr(`jsonb_set(answers, '{multi,"lOjNn9qfJgEGLBIxxe0ka"}', '["B","D"]'::jsonb, true)`))
```

要点小结
- 任何带 `?` 占位符的片段都能传参,防止 SQL 注入 。
- 更新零值、表达式、函数调用时优先用 `gorm.Expr`,否则结构体/Map 会忽略零值 。
- 可嵌进 `clause.Expr{SQL: "...", Vars: ...}` 里,与 GORM 的 Clause 体系无缝衔接 。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 16:11:37

科研协作平台搭建:共享TensorFlow算力资源池

科研协作平台搭建:共享TensorFlow算力资源池 在高校和科研机构中,一个常见的尴尬场景是:一边是某课题组的GPU服务器24小时满载运行,训练着庞大的视觉模型;另一边则是隔壁实验室的研究员苦等本地笔记本完成小批量实验—…

作者头像 李华
网站建设 2026/6/20 11:29:12

RTX 4090 vs A100:消费级与专业级GPU实战评测

RTX 4090 vs A100:消费级与专业级GPU实战评测 在生成式AI席卷全球的今天,从初创团队到大型企业,几乎每一个技术团队都在思考同一个问题:用什么硬件来跑我们的模型? 一边是价格亲民、性能强劲的消费级旗舰RTX 4090&am…

作者头像 李华
网站建设 2026/6/16 1:14:08

沉浸式3D抽奖体验:让每一次抽奖都成为视觉盛宴

沉浸式3D抽奖体验:让每一次抽奖都成为视觉盛宴 【免费下载链接】log-lottery 🎈🎈🎈🎈年会抽奖程序,threejsvue3 3D球体动态抽奖应用。 项目地址: https://gitcode.com/gh_mirrors/lo/log-lottery 还…

作者头像 李华
网站建设 2026/6/17 13:21:29

Obsidian终极美化指南:从基础到高级的CSS片段应用

Obsidian终极美化指南:从基础到高级的CSS片段应用 【免费下载链接】awesome-obsidian 🕶️ Awesome stuff for Obsidian 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-obsidian 还在为Obsidian笔记应用的默认界面感到单调乏味吗&#xf…

作者头像 李华
网站建设 2026/6/13 11:37:15

5分钟掌握SeedVR2:快速实现专业级视频修复的完整指南

5分钟掌握SeedVR2:快速实现专业级视频修复的完整指南 【免费下载链接】SeedVR2-7B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/SeedVR2-7B 你是否遇到过这样的困扰:精心拍摄的视频因为设备限制而画质模糊?珍贵的家…

作者头像 李华