还需要引入数据库对应的驱动, 如下以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" }
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()) } } })