当使用零值进行查询时,零值并没有作为查询条件进行查询
更新时也有这样的问题,零值不更新
如:
db.Where(&User{Name: "jinzhu", Age: 0}).Find(&users)
执行的sql语句是
SELECT * FROM "user" WHERE "Name" = "jinzhu"
SELECT * FROM "user" WHERE "Name" = "jinzhu" AND "Age" = 0
当使用结构作为条件查询时,GORM 只会查询非零值字段,更新也是如此。
使用 map 来构建查询条件
db.Where(map[string]interface{}{"Name": "jinzhu", "Age": 0}).Find(&users)
使用 map 来构建更新条件,而不是结构体user{}
或者,使用 Save
保存所有的字段,即使字段是零值
db.Model(&user).Where("Name", "jinzhu").Updates(map[string]interface{}{"Age": 0})
user.Name = "shuai"
user.Age = 0
db.Save(&user)
参考自:https://www.kancloud.cn/sliver_horn/gorm
如有不对,烦请指出~
在使用gorm的时候如果用结构体进行update或者updates会出现零值、空值不更新的问题,常见的办法有两种:
1.使用Save(),但是Save会保存所有字段,也就是说,必须将所有字段信息全部获取才能更新,否则没有传值的字段会更新成空。
2.使用map接口,即map[string]interface{},但是当我们使用的是protobuf定义了的结构时,转换成map有些许麻烦。
那么该如何解决呢?
合理结合结构体和map来达到可以更新0值的结果。由于在传入字段的时候如果
快速指南: 通过结构体变量
更新字段值,
gorm 库会忽略
零值字段。就是字段值等于 0, nil, “”,
false 这些值会被忽略掉,不会
更新。如果想
更新零值,可以使用 map 类型替代结构体。
我们都知道,使用 golang 定义一个变量并且不赋初始值时,初始值就默认为 0 值,比如 0, nil, “”,
false 等。
在使用
gorm 包进行数据库操作时,如果想要进行字段的
更新,只需要将要变动的字段进行修改,然后执行 db.Updates() 操作即可。
假定有如下结构体定义:
文章目录1. 场景:2. Gorm中更新操作说明1)更新全部字段: `save`2)更新单列字段:`update`3)更新多列字段:`updates`4)更新选定字段: `select`,`omit`3. 参考:
1. 场景:
在配置某一个参数时,假如该参数为bool类型。在从“ture"切换到”false"时发现数据库中没有更换过来
删除一个策略的描述信息时,发现修改失败,描述依然存在
这种情况基本上是由于一个原因导致的:Gorm使用Updates更新数据库操作时,只会更新非零字段。
在Go中0值的
func BenchmarkUpdateWithOptimistic ( b * testing. B ) {
dsn := "root:abc123@/test?charset=utf8&parseTime=True&loc=Local"
db , err :=
gorm . Open (
mysql . Open ( dsn ), &
gorm. Config {})
if err != nil {
fmt . Println ( err )
return
b . RunParallel ( func ( pb * testing. PB ) {
var out Optimistic
db . First ( & out , Optimistic { Id : 1 })
out . Amount =
Go Nested Set是的实现。
该项目是的Go版本,它使用相同的数据结构设计,因此它与一起使用相同的数据。
实际上,原始设计就是为此而设计的,由我们的Rails应用程序中的管理的内容,还需要维护前端Go API。
这是的Go版本,其构建目的是与兼容。
嵌套套可以做什么?
为了管理这样的嵌套树节点:
从拍摄的视频,由awesome_nested_set + 。
go get github.com/griffinqiu/go-nested-set
您必须使用nestedset Stuct标记来定义Gorm模型,如下所示:
支持结构标签:
id -int64-节点的主键
parent_id -sql.NullInt64-ParentID列,null为根
lft整数
rgt整数
depth -int-节点的深度
children_count人数
使用Postman,Insomnia,Talend API Tester等。
$ git clone https://github.com/DanielArturoAlejoAlvarez/CRUD-REST-API-WITH-GOLANG-1.16-3-GORM-AND-MYSQL.git
[NAME APP]
请按照以下步骤操作,一切顺利! 重要的:
可以在GitHub上( 上查看错误报告和请求请求。 该项目旨在提供一个安全,友好的合作空间,并且希望遵守《行为准则。
根据的规定,该gem可作为开源软件。
$ go get github.com/dedidot/gorm-gin
# Download Gin Framework
$ go get github.com/gin-gonic/gin
# Download GORM
$ go get github.com/jinzhu/gorm
在main.go中设置数据库
Config . DB , err = gorm . Open ( "mysql" , "DBUSERNAME:DBPASSWORD@t
先说解决方法,采用map传值
err := getReplenishmentRunWaveDefaultSettingSqlCommon(ctx).Where("id = ?", model.ID).Updates(map[string]interface{}{
"channel_id_list": ent.ChannelIdList,
"repl_type": ent.ReplType,
"contains_oos": ent.ContainsOos,
"contains_non_oos"
GORM 是一个用于在 Go 语言中操作数据库的库。它提供了许多方便的功能,可以帮助开发人员快速查询数据库。
要使用 GORM 进行查询,首先需要连接到数据库,然后使用模型定义查询条件,最后调用查询方法即可。
例如,如果你要查询名为 "John" 的用户,可以这样做:
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
func main() {
// 连接到数据库
db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic("连接数据库失败")
defer db.Close()
// 定义模型
type User struct {
Name string
// 查询
var user User
db.Where("name = ?", "John").First(&user)
希望这能帮到你!