Gorm
2022-05-10 23:54:19 11 举报
AI智能生成
gorm
作者其他创作
大纲/内容
模型定义
模型定义
模型是 GO中标准的struct
约定
GORM 倾向于约定,而不是配置
如:默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间
gorm.Model
构成:
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeleteAt `gorm:"index"`
可将gorm.Modle嵌入到自己的结构体中
高级选项
可用标签控制字段级别的权限,可以让一个字段的权限是只读、只写、只创建、只更新或者被忽略
允许读和创建
`gorm:"<-:create"`
允许读和更新
`gorm:"<-update"`
允许读和写(包含创建和更新)
`gorm:"<-"`
允许读,禁止写
`gorm:"<-:false"`
只读
`gorm:"->"`
读写操作均会忽略该字段
`gorm:"-"`
创建、更新时间跟踪
CreatedAt、UpdatedAt字段,gorm在创建、更新时会自动填充当前时间
如果要使用不同名称的字段,可配置auto相关标签
如果要保存UNIX(毫/纳)秒时间戳,而不是time,则可修改字段字段类型和标签
字段标签
model的tag是可选的
tag名大小写不敏感,但建议用camelCase风格
连接数据库
Mysql
基本使用
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
高级配置
Postgres
基本使用
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
Sqlite
Sql Server
CRUD
创建
普通创建
创建记录
1、编写数据记录
user:= User{....}
2、通过数据的指针创建记录
result :=db.create(&user)
用指定的字段创建记录
创建记录并更新给出的字段。
创建记录并更新未给出的字段。
批量创建记录
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)
创建记录的钩子
可定义钩子,在创建记录时调用这些钩子方法
钩子种类
BeforeSave, BeforeCreate, AfterSave, AfterCreate
定义钩子示例
根据Map创建记录
高级
关联创建
1、如果关联的值是非零值,则这些关联数据会被更新插入,且钩子也会被调用
2、可通过Select、Omit跳过关联保存
默认值
`gorm:"default:18"`
插入记录到数据库时,默认值 会被用于 填充值为 零值 的字段
若要在迁移时跳过默认值定义,你可以使用 default:(-)
创建记录冲突解决方案
查询
查询单个记录
db.First(&user)
// 获取第一条记录(主键升序)
db.Take(&user)
// 获取一条记录,没有指定排序字段
db.Last(&user)
// 获取最后一条记录(主键降序)
根据主键查询
查询所有记录
条件查询
=
db.Where("name = ?", "jinzhu").First(&user)
<>(不等于)
db.Where("name <> ?", "jinzhu").Find(&users)
IN
db.Where("name IN ?", []string{"jinzhu", "jinzhu 2"}).Find(&users)
LIKE
- db.Where("name LIKE ?", "%jin%").Find(&users)
AND
db.Where("name = ? AND age >= ?", "jinzhu", "22").Find(&users)
TIME
db.Where("updated_at > ?", lastWeek).Find(&users)
BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
用Struct或Map作为条件来查询
注意:当使用结构作为条件查询时,GORM 只会查询非零值字段。这意味着如果您的字段值为 0、''、false 或其他 零值,该字段不会被用于构建查询条件
NOT
db.Not("name = ?", "jinzhu").First(&user)
Not In
OR
db.Where().Or().Find()
查询特定字段
db.Select("name”, “age").Find(&users)
db.Select([]string{"name", "age"}).Find(&users)
// SELECT name, age FROM users;
Order排序
Limit&Offset
db.Limit(10).Offset(5).Find(&users)
// SELECT * FROM users OFFSET 5 LIMIT 10;
Group & Having
db.Model(&User{}).Select("name, sum(age) as total").Where("name LIKE ?", "group%").Group("name").First(&result)
// SELECT name, sum(age) as total FROM `users` WHERE name LIKE "group%" GROUP BY `name`
https://learnku.com/docs/gorm/v2/query/9733#3d16eb
Distinct
db.Distinct("name", "age").Order("name, age desc").Find(&results)
Joins
https://learnku.com/docs/gorm/v2/query/9733#a231f4
San
将结果保存至Struct
高级查询
智能选择字段
加锁
加锁与解锁
sharedLock 不会阻止其他 transaction 读取同一行
lockForUpdate 会阻止其他 transaction 读取同一行
事务加锁与解锁
https://blog.csdn.net/weixin_41565755/article/details/121261581
子查询
Count
db.Model(&User{}).Where("name = ?", "jinzhu").Or("name = ?", "jinzhu 2").Count(&count)
更新
0 条评论
下一页