gorm相关实践

gorm是golang下操作数据的一种orm框架,能够方便开发者进行数据库操作。其设计哲学是约定大于配置,所以在掌握此框架时,需要熟悉其中做出的约定。

插入

  1. 插入
// 简单插入
user := User{Name:"xx", Age: 18, Birthday: time.Now()}
result := db.Create(&user)

user.ID // 返回插入数据的主键
result.Error // 返回Error
result.RowsAffected // 返回影响的行数
  1. 指定插入或忽略字段
db.Select("Name", "Age", "CreatedAt").Create(&user)  // Select 选择字段
db.Omit("Name", "Age", "CreatedAt").Create(&user)  // Omit忽略字段
  1. 批量插入
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)

for _, user := range users {
  user.ID // 1,2,3
}

var users = []User{{name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}}
// 数量为 100
db.CreateInBatches(users, 100)
  1. 默认值
    标签default可以为字段定义默认值。插入记录到数据库时,默认值 会被用于 填充值为 零值 的字段。对于声明了默认值的字段,像 0、''、false 等零值是不会保存到数据库。您需要使用指针类型或 Scanner/Valuer 来避免这个问题

查询

  1. First、Take、Last 获取一条记录。如果获取不到,则错误为ErrRecordNotFound
  2. Find在查询不到数据时不会返回ErrRecordNotFound
  3. First 和 Last 会根据主键排序,分别查询第一条和最后一条记录。 只有在目标 struct 是指针或者通过 db.Model() 指定 model 时,该方法才有效。如果相关 model 没有定义主键,那么将按 model 的第一个字段进行排序。

更新

  1. Save方法更新所有字段,即使字段是零值
  2. Update方法指定列,配合Where使用
  3. Updates更新多列

删除

  1. 如果包含gorm.deletedat字段,则调用Delete时会进行软删除
  2. db.Unscoped().Where("age=20").Find(&users), 可以查询到被软删除的记录
  3. db.Unscoped().Delete(&order), 永久删除匹配的记录

事务

  1. 事务使用如下:
db.Transaction(func(tx *gorm.DB) error {
  // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
  if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
    // 返回任何错误都会回滚事务
    return err
  }

  if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
    return err
  }

  // 返回 nil 提交事务
  return nil
}
  1. 嵌套事务
    GORM 支持嵌套事务,您可以回滚较大事务内执行的一部分操作
db.Transaction(func(tx *gorm.DB) error {
  tx.Create(&user1)

  tx.Transaction(func(tx2 *gorm.DB) error {
    tx2.Create(&user2)
    return errors.New("rollback user2") // Rollback user2
  })

  tx.Transaction(func(tx2 *gorm.DB) error {
    tx2.Create(&user3)
    return nil
  })

  return nil
})

// Commit user1, user3
  1. 手动事务
// 开始事务
tx := db.Begin()

// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
tx.Create(...)

// ...

// 遇到错误时回滚事务
tx.Rollback()

// 否则,提交事务
tx.Commit()

约定(开发过程中建议遵守这些约定)

1. 表名规则

默认情况,gorm使用ID作为主键,使用结构体名的蛇形复数作为表名,字段名的蛇形作为列名,并使用CreatedAt、UpdatedAt字段追踪创建、更新时间。

type User struct {
  ID uint
  Name string
}

上面User默认对应的数据库表名称为users

2. 默认字段

gorm中有一个默认的数据结构,集gorm.Model,结构如下

type Model struct {
  ID uint  `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdateAt time.Time
  DeletedAt gorm.DeleteAt   `gorm:"index"`
}

所以在开发过程中建议表中有这些字段

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • GORM中文文档读者可以直接看文档,本文只是从文档记录个人常用的一些操作。 1.安装 2.使用 官方一个快速入门的...
    10xjzheng阅读 13,341评论 1 1
  • gorm的一些使用注意(来自第三方文章,针对觉得重要的部分做一些记录)[来源](https://www.topgo...
    bug去无踪阅读 9,642评论 0 0
  • Gorm是golang的一个orm框架,它提供了对数据库操作的封装,使用起来相当便利。 但在项目开发中,代码写的多...
    海之方阅读 9,691评论 0 3
  • 胖sir :接着,给你一个馅饼儿 兵长 : 来嘞!!一篇来自ORM的整理笔记... 1 什么是ORM?为什么要⽤O...
    阿兵云原生阅读 1,293评论 0 1
  • 流程规范 服务正式上线前,一定要check下线上数据库改动已经上线。不然会引起线上事故! 测试环境也要有,不然测试...
    齐舞647阅读 3,398评论 0 4