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)
打赏
评论区
头像
    头像

    2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
    新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
    新车首发,新的一年,只带想赚米的人coinsrore.com
    新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
    做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
    新车上路,只带前10个人coinsrore.com
    新盘首开 新盘首开 征召客户!!!coinsrore.com
    新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
    新车即将上线 真正的项目,期待你的参与coinsrore.com
    新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
    新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com

    头像

    新盘新项目,不再等待,现在就是最佳上车机会!

文章目录