Gorm增删改查

首页 / Golang / 正文

gorm增删改查

// 连接数据库
package main

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/schema"
)

var GLOBAL_DB *gorm.DB

func main() {
    db, err := gorm.Open(mysql.New(mysql.Config{
        DSN: "root:root@tcp(127.0.0.1:8889)/test_gorm?charset=utf8mb4&parseTime=True&loc=Local", // DSN data source name
        DefaultStringSize: 256, // string 类型字段的默认长度
        DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
        DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
        DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
        SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
    }), &gorm.Config{
        SkipDefaultTransaction: false, // 是否跳过默认事务
        NamingStrategy: schema.NamingStrategy{ // 设置表名相关配置
            TablePrefix: "", // 标签缀
            SingularTable: true, // 如果为true的话,表默认创建为单数,比如user
        },
        DisableForeignKeyConstraintWhenMigrating: true, // 是否跳过外键约束,建议设置为true
    })

    if err != nil {
        fmt.Println("连接数据库失败:", err.Error())
    }
  
  GLOBAL_DB = db
}

新增数据

  • 新增一条数据
type User struct {
    gorm.Model
    Name string `gorm:"defalut:yiqi"`
    Age uint8 `gorm:"comment:年龄"`
}

GLOBAL_DB.AutoMigrate(&User{})
res := GLOBAL_DB.Create(&User{ // 新增一条数据
  Name: "颖小主",
  Age: 18,
})

fmt.Println(res.Error, res.RowsAffected) // res.Error错误信息,RowsAffected影响条数, 输出结果<nil> 1
  • 只新增指定字段数据
res := GLOBAL_DB.Select("name").Create(&User{ // 只新增name字段
  Name: "颖小主",
  Age: 18,
})
  • 除了指定字段,其他的都新增
res := GLOBAL_DB.Omit("name").Create(&User{ // 忽略了name字段
  Name: "颖小主",
  Age: 18,
})
  • 一次性创建多条数据
res := GLOBAL_DB.Create(&[]User {
  {Name: "颖小主", Age: 18},
  {Name: "itffz", Age: 20},
})

查询

  • 查询排序后的第一条数据
var result map[string]interface{} // var result = make(map[string]interface{})

GLOBAL_DB.Model(&User{}).First(&result)

fmt.Println(result)

// 或者
var TestUser User

GLOBAL_DB.Model(&User{}).First(&TestUser)
fmt.Println(TestUser) // {{1 2022-04-19 23:55:19 +0800 CST 2022-04-19 23:55:19 +0800 CST {0001-01-01 00:00:00 +0000 UTC false}} 颖小主 18}
  • 查询最后一条数据
var TestUser User

GLOBAL_DB.Model(&User{}).Last(&TestUser)
fmt.Println(TestUser)

主键检索

GLOBAL_DB.Model(&User{}).First(&TestUser, 1) // 1 就是主键id=1的
fmt.Println(errors.Is(res.Error, gorm.ErrRecordNotFound)) // 判断是否查询到了数据,如果查询到了这里输出false,如果没有查询到,这里输出true,并吧sql语句打印出来

where查询

  • sql语句方式
GLOBAL_DB.Where("name = ? and age = ?", "itffz", 20).First(&User{})
  • 结构体方式
type TestUser struct {
        Name string
    }
    GLOBAL_DB.Where(TestUser {
        Name: "itffz",
    }).First(&User{})
    fmt.Println(&User{})
  • map方式
GLOBAL_DB.Where(map[string]interface{} {
        "name": "颖小主",
    }).First(&User{})
    fmt.Println(&User{})

find查询多条数据

var TestUser []User
GLOBAL_DB.Where("name like ?", "%it%").Find(&TestUser)
fmt.Println(TestUser)

更新

update 只更新选择的字段

Updates 更新所有字段 此时有两种形式,一种为map 一种为结构体,结构体零值不参与更新

save 无论如何都更新所有内容,包括0值

  • update
GLOBAL_DB.Model(&User{}).Where("id = ?", 1).Update("name", 123)
  • save
var users []User
    res := GLOBAL_DB.Where("id = ?", 1).Find(&users)
    for k := range users{
        users[k].Age = 12
    }
    res.Save(&users)
  • updates
var users User
GLOBAL_DB.First(&users).Updates(User{Name:"", Age: 1}) // 结构体方式,注意,结构题方式空值,0值是不参与更新的,所以这里只有age字段被更新了
GLOBAL_DB.First(&users).Updates(map[string]interface{} {"Name": "", "Age": 0}) // map形式,注意,map形式全部参与更新

删除

type users []User
GLOBAL_DB.Where("id = ?", 1).Delete(&users) // 删除符合条件的所有数据,注意这是软删除,软删除会将deleted_at赋值一个当前的时间
GLOBAL_DB.Unscoped().Where("id = ?", 2).Delete(&users) // 这个删除会把数据库中的数据彻底删除

原生sql

var users []User
LOBAL_DB.Raw("select * from user where id > ?", 2).Scan(&users)
fmt.Println(&users)
打赏
评论区
头像
文章目录