gorm基本操作

一. 引入gorm包

还需要引入数据库对应的驱动, 如下以mysql为例

import (
   _ "github.com/go-sql-driver/mysql"
   "github.com/jinzhu/gorm"
)

二. 基础设置

1.创建连接

创建方法与database/sql的Open方法基本一致,需要指明驱动类型

var db *gorm.DB

func main() {
   dsn := "root:root@tcp(127.0.0.1:3306)/d_liudutui?charset=utf8"
   conn, err := gorm.Open("mysql",dsn)
   if err != nil {
      panic(err)
   }
   defer conn.Close()
   db = conn
}

2.声明model

type User struct {
   ID string `gorm:"column id"`
   Name string `gorm:"column name"`
   Gender int `gorm:"column gender"`
   CreateTime int `gorm:"column create_time"`
   UpdateTime int `gorm:"column update_time"`
}

3.设置表名

func (u *User) TableName() string{
   return "t_user"
}

三. CURD

1.添加

注意需要传入指针,因为hooks的方法等绑定在指针上

func Create() {
   user := User{
      ID:     "5",
      Name:   "wang",
      Gender: 1,
   }
   db.Create(&user)
}

2.删除

func Delete() {
   db.Where("id = ?", 4).Delete(&User{})
}

3.修改

通过model方法绑定到User类型上

func Update() {
   type updateColumn map[string]interface{}
   update := updateColumn{
      "name": "new_wang",
      "update_time":1234,
   }
   db.Model(&User{}).Where("id = ?",4).Updates(update)
}

4.查询

单条查询用First()方法即可, sql语句会在最后添加order by id limit 1

func QueryOne() {
   var user User
   if db.Where("id = ?", 2).First(&user).RecordNotFound() {
      fmt.Println("NOT FOUND")
   }
   fmt.Println(user)
}

多条查询使用Find()方法

func BatchQuery() {
   var users []*User
   db.Find(&users)
   fmt.Println(users)
}

四. Transaction

设置到到三个方法

开始: tx := db.Begin()

提交: tx.Commit()

回滚: tx.Rollback()

以批量插入操作为例

func BatchCreate() {
   var users []User
   users = append(users, User{
      ID:     "3",
      Name:   "san",
      Gender: 0,
   },User{
      ID:     "4",
      Name:   "si",
      Gender: 0,
   })
   tx := db.Begin()
   defer tx.Rollback()
   for _, v := range users {
      tx.Create(&v)
   }
   tx.Commit()
}

五. Hooks

在CURD操作后触发

包括:

BeforeCreate() AfterCreate() BeforeUpdate() AfterUpdate() BeforeDelete() AfterDelete() AfterFind() 等 

以创建记录前添加create_time为例

func (u *User) BeforeCreate(scope *gorm.Scope) error{
   now := time.Now().Unix()
   return scope.SetColumn("create_time", now)
}

六. Callback

全局统一添加回调方法,包括Register注册 ,Replace替换,Remove移除等操作

系统默认注册了一些回调方法可以在callback_update(create/delete).go文件中查看 

需要注意注册的顺序,如下在修改操作时统一更新update_time, 需要在gorm:update之前注册才能生效

db.Callback().Update().Before("gorm:update").Register("my_plugin:update_time", func(scope *gorm.Scope) {
   if updatedAtField, ok := scope.FieldByName("UpdateTime"); ok {
      if updatedAtField.IsBlank {
         scope.SetColumn("update_time", time.Now().Unix())
      }
   }
})

 

 

你可能感兴趣的:(go)