GORM中文文档http://gorm.book.jasperxu.com/
- 操作一张表,一般对应一个model包下的struct,总结几条规则:
type Animal struct {
AnimalId int64 `gorm:"primary_key"` // 设置AnimalId为主键
AgeTime int64 // 自动对应表中age_time字段
Birthday time.Time `gorm:"column:day_of_the_beast"` // 绑定字段名为`day_of_the_beast`
}
- gorm有几个字段非常有意思:
CreateAt
UpdateAt
DeleteAt // 软删除时经常会用到
这几个字段分别在对应操作下会自动更新
- 查
// 常用查询
db.Table("table_name").Where("id = ?",Id).Find(&dbItem)
// 取反查询
db.Table("table_name").Not("id = ?",Id).Find(&dbItem)
// 取数量
db.Table("table_name").Where("id=?",id).Count(&count)
// 取一列
db.Table().Where().Pluck("name",&name)
// 取多列
db.Table().Select("name,age").Where().Scan(&name,&age)
- 改
// 所有字段全部更新
db.Table().where().Save()
// 更新部分属性
db.Table().where().Update(map[string]interface{}{"name":"ShellDawn"})
// 更新时只选择某些字段更新
db.Table().Select().Update()
// 更新时忽略某些字段
db.Table().Omit().Update()
有 一 点 很 有 意 思 , 使 用 s t r u c t 进 行 U p d a t e 更 新 时 \red{有一点很有意思,使用struct进行Update更新时} 有一点很有意思,使用struct进行Update更新时
s t r u c t 中 属 性 值 为 空 白 值 时 则 不 更 新 \red{struct中属性值为空白值时则不更新} struct中属性值为空白值时则不更新
- 删
// 只有model有DeleteAt字段才会软删除,其他都为硬删除
// 谨慎使用delete,一般业务逻辑不会允许硬删除
db.Table().Where().Delete()
- 增
//
db.Table().Create(&dbItem)
事 务 : \red{事务:} 事务:
func CreateAnimals(db *gorm.DB) err {
tx := db.Begin()
// 注意,一旦你在一个事务中,使用tx作为数据库句柄
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
tx.Rollback()
return err
}
tx.Commit()
return nil
}
- 支持原生SQL
db.Exec("DROP TABLE users;")
db.Exec("UPDATE orders SET shipped_at=? WHERE id IN (?)", time.Now, []int64{11,22,33})
db.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result)
- 使用rows来获取原始数据
rows, err := db.Model(&User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error)
defer rows.Close()
for rows.Next() {
var user User
db.ScanRows(rows, &user)
// do something
}