Gorm学习记录1 | 青训营

69 阅读2分钟

Gorm学习记录1

Object-Relationl Mapping, 它的作用是映射数据库和对象之间的关系方便我们在实现数据库操作的时候不用去写复杂的sql语句,把对数据库的操作上升到对于对象的操作。

gorm

gorm基于Go语言实现的ORM框架。

github.com/jinzhu/gorm

gorm.io/

  1. Gorm 基础使用
type Product struct{ //定义gorm模型,字段包含数据库表的字段
    Code string
    Price unit
    }
//为结构体实现TableName接口,返回字符串就是表名
func(p Prodect) TableName(){  //gorm使用名为ID的字段作为主键
    return "product"
    }
    
func main(){
    db,err:=gorm.Open(//连接数据库
        mysql.Open("xxxxx"),&gorm.Config{})
    if err!=nil{
        panic("failed to connect database")
    }
    //创建数据
    db.Create(&Product{Code:"D42",Price:130})
    
    //查询数据
    var product Product
    //First方法查询单条记录
    dp.First(&product,1) //结构体指针,用于承载修改;整形代表主键查找
    db.First(&product,"code=?","D42") //查询code=D42的记录
    
    //更新数据
    db.Model(&product).Update("price",200)//键:值 单一修改
    db.Model(&product).Updates(Product{Price:200,Code:"F42");
    db.Model(&product).Updates(map[string]interface{}{"Price":200,"Code":"F42"})
    
    //删除数据
    db.Delete(&product,1)

当未实现TableName方法时,使用结构体的蛇形负数做为表名

  1. 数据创建 创建数据时出现数据冲突使用clasuse.OnConflict处理数据冲突
p:=&Product{Code:"D42",ID:1}
db.Clauses(clause.OnConflict{DoNothing:true}).Create(&p)

在模型中使用标签未字段定义默认值

type User struct{
    ID int64
    Name string `gorm:"defalut:goleone`
}
  1. 查询操作:
  • First查询不到数据会返回ErrRecordNotFound
  • 查询多条数据查询不到不会返回错误
  • 结构体查询时,只查询非0字段,需要查询零值字段时需要使map来查询
  1. 更新数据
  • 更新数据时,使用结构体只会更新非零值,如果需要更新零值需要使用Map和Select选择字段
  1. 删除数据
  • GORM 提供了 gorm.DeletedAt 用于帮助用户实现软删拥有软删除能力的 Model 调用 Delete 时,记录不会被 从数据库中真正删除。但 GORM 会将 DeletedAt 置为当前时间,并且你不能再通过正常的查询方法找到该记录使用 Unscoped 可以查询到被软删的数据