GORM 基础CRUD

基础CRUD操作文件记录

基本的插入、更新、删除、更多查看 GROM官网 查询
默认不使用全局日志输出,可以在执行前的代码加上Debug() 可以输出执行的SQL语句
例如:db.Debug().Unscoped().Delete(&user)

package main

import (
    "fmt"
    "time"

    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

// User 用户结构体
type User struct {
    gorm.Model
    Name     string  `gorm:"size:100"`
    Age      uint    `gorm:"size:3"`
    Address  string  `gorm:"type:varchar(100)"`
    Money    float64 `gorm:"type:decimal(10,2)"`
    Birthday time.Time
}

// TableName 通过TableName方法将User表命名为`sys_users`
func (user User) TableName() string {
    return "sys_user"
}

// BeforeCreate 想在BeforeCreate hook 中修改字段的值
func (user *User) BeforeCreate(scope *gorm.Scope) error {
    fmt.Println("结构创建前")
    // scope.SetColumn("ID", uuid.New())
    return nil
}

// BeforeUpdate 想在BeforeUpdate hook 中修改字段的值
func (user *User) BeforeUpdate(scope *gorm.Scope) error {
    fmt.Println("结构更新前")
    // 使用UpdateColumn, UpdateColumns不会触发
    // scope.SetColumn("ID", uuid.New())
    return nil
}

// AfterUpdate 想在AfterUpdate hook 中修改字段的值
func (user *User) AfterUpdate(scope *gorm.Scope) error {
    fmt.Println("结构更新后")
    // 使用UpdateColumn, UpdateColumns不会触发
    // scope.SetColumn("ID", uuid.New())
    return nil
}

// BeforeSave 想在BeforeSave hook 中修改字段的值
func (user *User) BeforeSave(scope *gorm.Scope) error {
    fmt.Println("结构保存前")
    // 使用UpdateColumn, UpdateColumns不会触发
    //  scope.SetColumn("EncryptedPassword", pw)
    return nil
}

// String 用户字符串化
func (user *User) String() string {
    return fmt.Sprintf("编号:%d ,名字:%s ,年龄: %d , 金钱: %.3f , 生日:%s", user.ID, user.Name, user.Age, user.Money, user.Birthday)
}

// 基础CRUD
func main() {
    db, err := gorm.Open("mysql", "username:password@(127.0.0.1:3306)/database?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        println("err", err)
    }
    defer db.Close()

    // 创建表
    // db.CreateTable(&User{})
    // 检查表是否存在
    // db.HasTable(&User{})
    // 删除表
    // db.DropTable(&User{})
    // 不存在表时创建
    db.AutoMigrate(&User{})

    // 插入
    user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now(), Money: 123.34}
    fmt.Printf("数据库内结果主键为空 %t \n", db.NewRecord(user))
    db.Create(&user)
    // fmt.Println(user.String())

    // 更新单属性
    // db.Model(&user).Update("name", "update")
    // 更新根据给定的条件更新单个属性
    //db.Model(&user).Where("age = ?", 18).Update("name", "update")
    // 更新使用 struct 更新多个属性,只会更新其中有变化且为非零值的字段
    // db.Model(&user).Updates(User{Name: "update", Age: 66, Ac: 99.99})
    // fmt.Println(user.String())

    // 删除现有记录 只会将DeletedAt 字段的值会被设置为当前时间
    // db.Delete(&user)
    // 直接清除记录
    // db.Unscoped().Delete(&user)
    // 条件删除
    // db.Where("name LIKE ?", "%update%").Delete(User{})
    // fmt.Println(user.String())

    // user := User{}
    // 通过主键查询第一条记录
    // db.First(&user)
    // 随机取一条记录
    // db.Take(&user)
    // 通过主键查询最后一条记录
    // db.Last(&user)
    // 查询指定的某条记录ID(只可在主键为整数型时使用)
    // db.First(&user, 1)
    // 通过条件查询第一条记录
    // db.Where("age = ?", "18").First(&user)
    // fmt.Println(user.String())

    var users []User
    // 拿到所有的记录
    db.Find(&users)
    // 通过条件指定字段查询
    // db.Where("age = ?", "18").Find(&users)
    // 通过条件多指定字段查询
    // db.Where("name = ? AND age >= ?", "jinzhu", "18").Find(&users)
    // 通过条件<>查询关键字前后
    // db.Where("name <> ?", "jinzhu").Find(&users)
    // 通过条件in查询关键字是否存在
    // db.Where("age IN (?)", []float64{18, 20}).Find(&users)
    // 通过条件link模糊查询
    // db.Where("name LIKE ?", "%jin%").Find(&users)
    // 通过条件BETWEEN AND区间范围查询
    // db.Where("created_at BETWEEN ? AND ?", "2019-11-15 19:17:03", time.Now()).Find(&users)
    // 通过条件>指定值查询
    // db.Where("created_at > ?", "2019-11-15 10:17:03").Find(&users)
    // 通过条件不等值查询 类似where
    // db.Not("created_at > ?", "2019-11-15 10:17:03").Find(&users)
    // 通过条件Or查询 Struct 结构体参数
    // db.Where("name = 'jinzhu'").Or(User{Name: "jinzhu 2"}).Find(&users)
    // 通过条件Or查询 Map 多值条件
    // db.Where("name = 'jinzhu'").Or(map[string]interface{}{"name": "jinzhu1234"}).Find(&users)
    // 通过Select,指定你想从数据库中检索出的字段,默认会选择全部字段
    // db.Select([]string{"name", "age"}).Find(&users)
    // 查询软删除记录
    // db.Debug().Unscoped().Where("deleted_at is not NULL").Find(&users)
    for i, v := range users {
        fmt.Println(i, v.String())
    }

    // 恢复删除记录
    // user := User{}
    // db.Unscoped().Where("deleted_at is not NULL and id = ?", 5).Find(&user)
    // db.Unscoped().Model(&user).Where("deleted_at is not NULL").Update("deleted_at", nil)
    // fmt.Println(user.String())

}

你可能感兴趣的:(GORM 基础CRUD)