Gorm 学习笔记

orm 对象关系映射

o => 结构体 => 模型对应数据库中某张表

r => mysql

m => 映射

 

结构体对应一张数据表,结构体字段对应数据库字段,结构体实例对应一条数据行记录。

1.自动迁移功能

2.表名默认为结构体名称的复数。大驼峰结构会被转化成小写下划线链接。定义结构体过程就是在定义模型

3.结构体标签,约束建表的约束

4.加统一数据表前缀

5.colmun可以设置结构体字段映射到数据表的字段

6.DB.Debug().Create() => 开启debug 模式可以打印执行的sql语句

7.所有字段的零值都不会被保存到数据库,但会自动填充预设的默认值。===>

(1)如果想更新零值,在定义结构体字段时,给指针类型,如

(2)或者给 sql.NullString 类型

type UserInfo struct {
     Name  *string  `json:"name"` 
}

DB.Create(&UserInfo{ Name: new(string) }) // 这里需要构建一个 new(string) 字符串指针,不然传入类型不匹配。

type UserInfo struct {
     Name  sql.NullString `json:"name"` 
}

DB.Create(&UserInfo{ Name: sql.NullString{String:"", Vaild:true} }) // 这里需要构建一个 new(string) 字符串指针,不然传入类型不匹配。
 

(8) 通过结构体查询时,零值也会被忽略,不会通过零值过滤数据  

(9) Count 必须是链式查询的最后一个操作

(10)Select 可以指定别名

(11) Save 方法默认会修改所有字段!!

(12)Update / Updates 修改指定字段。Updates()方法里传入 map 时,只会更新有变化的字段。传入 struct ,只会更新指定的非0值字段。更新选定的字段Select, Omit。需要更新零值时传入 map

(13) 查询默认是查不到软删除记录的,如果需要查询,则加 Unscope()

 

(1)定义模型

(2)将模型与数据库对应起来(自动迁移)

(3)实例化结构体,操作数据库

 

 

var user User // 创建一个类型为 User 结构体的变量 user

DB.First(&user) // 查询结果给 变量 user 赋值

First 里传入指针 user := new(User) 时,则可以直接传入 DB.First(user)

 

 

但是gorm.Updates时可要注意了, 如果没有使用db.Model指定model结构体, 就不能更新UpdatedAt.

所以如果这样:

db.Table(tableName).Updates(map[string]interface{})

是无法更新更新时间的.

正确做法是:

db.Model(&User{}).Updates(map[string]interface{})
posted @ 2021-05-26 08:29  winyh  阅读(257)  评论(0编辑  收藏  举报