Gin 框架 Gorm更新零值

Gorm是用go语言编写的orm框架,它将数据库的结构与语言(golang)本身的数据结构对应了起来,其目的是为了加快我们CRUD的速度,简化sql语句的书写,利用对象的思想,让Gorm框架为我们拼接sql语句。但是在使用过程中有不少的坑还是需要注意一下。

使用struct更新仅适用于非零值

user:=User{
	Name:"",
	Age:0,
	Actived:false,
}
db.Model(&user).Updates(user)
//此时不会更新这些零值,如需更新零值使用map
userMap:=map[string]interface{}{
  "name":"",
  "age":0,
  "actived":0,
}
db.Model(&user).Updates(userMap)

 

Gorm表名尾部自动加s

Gorm处理数据结构的时候遵循的是首字母规则和驼峰规则。对于结构体User,根据约定,其表名为users。

这里有两种方式去修改表名:第一种就是去掉这个默认设置;第二种就是在保留默认设置的基础上通过重新设定表名来替换。

先说如何通过重新设定表名来替换,可以实现 Tabler 接口来更改默认表名,例如:

type Tabler interface {
	TableName() string
}
// TableName 会将User的表名重写为 `new_user`
func (User) TableName()string {
	return "new_user"
}

 

可以在创建数据库连接的时候,去掉这个默认设置

db.SingularTable(true)

 

错误的使用ErrRecordNotFound

在我印象中有个错误的认知:如果Gorm没有找到record,则会返回ErrRecordNotFound 的错误,但是在具体使用中并不是这样

Demo

func main() {
  db := gorm.Open("mysql",url)
  user := &User{}
  users := make([]*User, 0, 0)
  err := db.Model(user).Where("id = ?", 1).First(user).Error
  fmt.Println(err, user)

  err = db.Model(user).Where("id = ?", 1).Find(&users).Error
  fmt.Println(err, user)
}

结果

record not found &{0  }
<nil> &{0  }

 

使用Gorm.Model后无法查询数据

  • Scan error on column index 1, name “created_at”: unsupported Scan, storing driver.Value type []uint8

解决方法:

打开数据库的时候加上parseTime=true

root:123456@tcp(127.0.0.1:3306)/mapdb?charset=utf8&parseTime=true

 

数据库字段映射

  • 正常的数据库字段映射 user_name 映射为UserName
  • 带数字的数据库字段映射 api_ip_1映射为ApiIp_1而非ApiIp1

 

发表评论