官网链接🔗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")
}