美文网首页Go
GORM 基础CRUD

GORM 基础CRUD

作者: TsMask | 来源:发表于2019-11-17 20:04 被阅读0次
基础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

    基础CRUD操作文件记录 基本的插入、更新、删除、更多查看 GROM官网 查询默认不使用全局日志输出,可以在执行前...

  • GORM-V1-CRUD

    [TOC] 说明 请先阅读官方文档[http://gorm.book.jasperxu.com/],由于官方文档对...

  • 使用gin与gorm开发CRUD操作

    gin启动 昨天学习到gin如何返回一个json数据之后,希望按照往常的开发经验,定义统一的返回报文体,于是定义了...

  • github上Go项目star排名21~30

    Gorm[https://github.com/go-gorm/gorm]:https://github.com/...

  • gorm Update方法

    gorm[https://github.com/go-gorm/gorm/],字节jinzhu[https://g...

  • 聊聊gorm的DeletedAt

    序 本文主要研究一下gorm的DeletedAt DeletedAt gorm.io/gorm@v1.20.10/...

  • 聊聊gorm的OnConflict

    序 本文主要研究一下gorm的OnConflict OnConflict gorm.io/gorm@v1.20.1...

  • 聊聊gorm的Transaction

    序 本文主要研究一下gorm的Transaction Transaction gorm.io/gorm@v1.20...

  • 聊聊gorm的prometheus

    序 本文主要研究一下gorm的prometheus Plugin gorm.io/gorm@v1.20.10/in...

  • 聊聊gorm的GroupBy

    序 本文主要研究一下gorm的GroupBy GroupBy gorm.io/gorm@v1.20.11/clau...

网友评论

    本文标题:GORM 基础CRUD

    本文链接:https://www.haomeiwen.com/subject/rdqmictx.html