初学Gorm

官网链接🔗GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

整理一些Gorm操作MySQL的常用操作

查询类操作

package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	Name string `gorm:"unique"`    // gorm:"unique" 代表该字段唯一
	Age  int    `gorm:"default:0"` // 默认值为0
}

func main() {
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	dsn := "root:123456@tcp(127.0.0.1:3306)/gindb?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic("failed to connect database")
	}

	/*
		var u User
		u.Name = "tom"
		u.Age = 18
		// 创建一条记录
		db.Create(&u)

		var uers []User
		u1 := User{Name: "jose", Age: 18}
		u2 := User{Name: "jerry", Age: 20}
		u3 := User{Name: "jack", Age: 22}
		uers = append(uers, u1, u2, u3)
		// 批量创建记录
		db.Create(&uers)
	*/

	// 创建 user 表
	// db.AutoMigrate(&User{})

	// 查询一条记录
	var u User
	// 获取第一条记录(按主键升序)
	fmt.Println("first")
	db.First(&u)
	fmt.Println(u.Name, "-", u.Age, "岁")

	// 获取最后一条记录(主键降序)
	fmt.Println("last")
	db.Last(&u)
	fmt.Println(u.Name, "-", u.Age, "岁")

	// 获取指定主键的记录
	fmt.Println("====RowsAffected====")
	users := []User{}
	res := db.Where("age >= ?", 20).Find(&users) // 查询 age >= 20 的记录
	cnt := res.RowsAffected                      //用于获取受影响的行数
	fmt.Println("查询到的记录数:", cnt)
	for i, user := range users {
		fmt.Println("第", i+1, "条数据", user.Name, "-", user.Age, "岁")
	}

	// 查找全部数据
	fmt.Println("====查找全部数据====")
	db.Find(&users) // 查询所有记录
	for i, user := range users {
		fmt.Println("第", i+1, "条数据", user.Name, "-", user.Age, "岁")
	}

	// or
	fmt.Println("====or====")
	db.Where("age >= ?", 18).Or("name = ?", "tom").Find(&u) // 查询 age >= 20 或 name = tom 的记录
	fmt.Println(u)

	// not
	fmt.Println("====not====")
	db.Not("name = ?", "tom").Find(&users) // 查询 name != tom 的记录
	for i, user := range users {
		fmt.Println("第", i+1, "条数据", user.Name, "-", user.Age, "岁")
	}

	// select
	fmt.Println("====select====")
	db.Select("id", "created_at", "name").Find(&users) // 查询所有记录的创建时间
	for _, user := range users {
		fmt.Println(user)
	}

	// 排序
	fmt.Println("====order====")
	db.Order("age desc").Find(&users) // 按照年龄降序排列
	for i, user := range users {
		fmt.Println("第", i+1, "条数据", user.Name, "-", user.Age, "岁")
	}

	fmt.Println("====================")
	fmt.Println("finished")
}

更新类操作

package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	Name string `gorm:"unique"`    // gorm:"unique" 代表该字段唯一
	Age  int    `gorm:"default:0"` // 默认值为0
}

func dataInfo(db *gorm.DB, users []User) {
	fmt.Println("==========当前数据库信息==========")
	db.Find(&users) // 查询所有记录
	for i, user := range users {
		fmt.Println("第", i+1, "条数据是:", user.Name, "-", user.Age, "岁")
	}
}

func main() {
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	dsn := "root:123456@tcp(127.0.0.1:3306)/gindb?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic("failed to connect database")
	}

	u := User{Name: "cookie", Age: 118}

	// 不要将 Save 和 Model一同使用, 这是 未定义的行为

	if err := db.Save(&u).Error; err != nil {
		fmt.Println("数据已存在:", err)
	} else {
		fmt.Println("保存成功")
	} // 保存记录,如果主键存在则更新,否则插入

	// 更新单个列
	dataInfo(db, []User{})
	db.Model(&u).Where("name = ?", "tom").Update("name", "tomcat") // 把name为tom的记录的name更新为tomcat
	dataInfo(db, []User{})

	// 批量更新
	dataInfo(db, []User{})
	db.Model(&u).Where("age = ?", 18).Update("age", 101) // 把age=18的记录的age更新为101
	dataInfo(db, []User{})

	fmt.Println("=====================")
	fmt.Println("finished")
}

删除类操作

package main

import (
	"fmt"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
)

type User struct {
	gorm.Model
	Name string `gorm:"unique"`    // gorm:"unique" 代表该字段唯一
	Age  int    `gorm:"default:0"` // 默认值为0
}

func dataInfo(db *gorm.DB, users []User) {
	fmt.Println("==========当前数据库信息==========")
	db.Find(&users) // 查询所有记录
	for i, user := range users {
		fmt.Println("第", i+1, "条数据是:", user.Name, "-", user.Age, "岁")
	}
}

func main() {
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	dsn := "root:123456@tcp(127.0.0.1:3306)/gindb?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic("failed to connect database")
	}

	dataInfo(db, []User{})
	// 删除tomcat表
	db.Where("name = ?", "tomcat").Delete(&User{}) // 删除name为tomcat的记录
	// id	created_at				updated_at				deleted_at				name	age
	// 1	2025-04-20 15:29:54.544	2025-04-21 10:16:36.939	2025-04-21 10:22:51.480	tomcat	101
	// Delete时会将deleted_at字段设置为当前时间,只是逻辑的删除
	dataInfo(db, []User{})
	// 物理删除
	db.Unscoped().Where("name = ?", "tomcat").Delete(&User{}) // Unscoped是物理删除,直接删除数据库记录
	dataInfo(db, []User{})

	// 根据主键删除
	db.Delete(&User{}, 2) // 删除主键为1的记录
	dataInfo(db, []User{})
	// 根据主键删除多条记录
	db.Delete(&User{}, []int{1, 2}) // 删除主键为1和2的记录

	// 批量删除
	db.Where("name IN ?", []string{"tomcat", "jerry"}).Delete(&User{}) // 删除name为tomcat和jerry的记录
	dataInfo(db, []User{})

	// 返回删除行的数据
	// 回写所有列

	fmt.Println("========删除========")
	var del_users []User
	db.Clauses(clause.Returning{}).Where("age > ?", 99).Delete(&del_users) // 删除age大于99的记录,并将删除的记录返回到del_users中
	dataInfo(db, del_users)

	fmt.Println("=====================")
	fmt.Println("finished")
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值