结构体对应一张数据表,结构体字段对应数据库字段,结构体实例对应一条数据行记录。
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{})