GORM快速入门(只需一篇即可学会)

一、什么是GORM?

GORM 是 Go 语言中一个非常流行的 ORM(对象关系映射)库,它提供了一种简单而强大的方式来将 Go 结构体映射到数据库表,并提供了丰富的方法来操作数据库,比如查询、插入、更新和删除数据等。

二、GORM连接MySQL以及AutoMigrate创建表

安装 GORM 和 MySQL 驱动

go get "gorm.io/driver/mysql"
go get "gorm.io/gorm"

数据库连接

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

var db *gorm.DB

func initDB() {
	dsn := "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
	db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		SkipDefaultTransaction: true,
		DisableForeignKeyConstraintWhenMigrating: true,
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true,
		},
	})
	if err != nil {
		// handle error
	}
}

AutoMigrate 自动创建表

type User struct {
	gorm.Model
	Name string
	Age  int
}

func autoMigrate() {
	db.AutoMigrate(&User{})
}

三、查询

1. 检索单个对象(First、Take、Last)

var user User
result := db.Where("name = ?", "张三").First(&user)
if result.Error != nil {
	if errors.Is(result.Error, gorm.ErrRecordNotFound) {
		// handle not found
	}
	// handle other errors
}

2. 使用 Find() 方法检索多个对象

var users []User
result := db.Where("age = ?", 20).Find(&users)
if result.Error != nil {
	// handle error
}

3. 根据指定字段查询

var users []User
result := db.Select("name", "age").Where("age = ?", 20).Find(&users)
if result.Error != nil {
	// handle error
}

4. 使用 Raw SQL 进行查询

var user User
db.Raw("SELECT * FROM users WHERE id = ?", 1).Scan(&user)

5. 使用 Joins 进行联表查询

type User struct {
	ID       uint
	Name     string
	Age      int
	Orders   []Order
}

type Order struct {
	ID       uint
	OrderNum string
	UserID   uint
}

func getUsersWithOrders() {
	var users []User
	db.Preload("Orders").Find(&users)
}

四、更新

1. Save() 方法保存多个字段

user := User{Name: "张三", Age: 18}
result := db.Save(&user)
if result.Error != nil {
	// handle error
}

2. 更新单个字段

result := db.Model(&User{}).Where("name = ?", "张三").Updates(map[string]interface{}{"age": 30, "name": "李四"})
if result.Error != nil {
	// handle error
}

3. 使用 SQL 表达式更新

db.Model(&User{}).Where("age > ?", 20).UpdateColumn("age", gorm.Expr("age + ?", 2))

五、删除

软删除

var user User
result := db.Where("age < ?", 98).Delete(&user)
if result.Error != nil {
	// handle error
}

物理删除

db.Unscoped().Delete(&User{}, 5, 6)
if db.Error != nil {
	// handle error
}

六、关联

一对一关联

type User struct {
	gorm.Model
	Name string
	Age  int
	CreditCard CreditCard
}

type CreditCard struct {
	gorm.Model
	Number string
	UserID uint
}

func autoMigrate() {
	db.AutoMigrate(&User{}, &CreditCard{})
}

一对多关联

type User struct {
	gorm.Model
	Name string
	Age  int
	Orders []Order
}

type Order struct {
	gorm.Model
	OrderNum string
	UserID uint
}

func autoMigrate() {
	db.AutoMigrate(&User{}, &Order{})
}

多对多关联

type User struct {
	gorm.Model
	Name string
	Age  int
	Roles []Role `gorm:"many2many:user_roles;"`
}

type Role struct {
	gorm.Model
	Name string
	Users []User `gorm:"many2many:user_roles;"`
}

func autoMigrate() {
	db.AutoMigrate(&User{}, &Role{})
}

七、迁移

GORM 提供了自动迁移功能,可以根据模型自动创建、更新表结构。

func autoMigrate() {
	err := db.AutoMigrate(&User{}, &Order{}, &CreditCard{})
	if err != nil {
		// handle error
	}
}

八、事务

GORM 支持事务操作,可以使用 Transaction 方法来处理事务。

func createUserWithTransaction() {
	err := db.Transaction(func(tx *gorm.DB) error {
		if err := tx.Create(&User{Name: "张三", Age: 18}).Error; err != nil {
			return err
		}
		if err := tx.Create(&Order{OrderNum: "123456", UserID: 1}).Error; err != nil {
			return err
		}
		return nil
	})
	if err != nil {
		// handle error
	}
}

九、钩子

GORM 提供了钩子函数,在创建、更新、删除等操作前后执行特定的逻辑。

type User struct {
	gorm.Model
	Name string
	Age  int
}

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
	if u.Name == "" {
		err = errors.New("name can't be empty")
	}
	return
}

十、批量操作

GORM 支持批量插入、更新、删除操作。

批量插入

users := []User{
	{Name: "张三", Age: 18},
	{Name: "李四", Age: 20},
}
db.Create(&users)

批量更新

db.Model(&User{}).Where("age > ?", 20).Updates(map[string]interface{}{"age": 30})

批量删除

db.Where("age > ?", 20).Delete(&User{})
  • 35
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

席万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值