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相关实践)