ZBLOG

GOLANG gorm

Go语言GORM框架指南

GORM是Go语言中最流行的ORM(对象关系映射)库之一,它提供了简洁的API来操作数据库。以下是GORM的核心使用方法和最佳实践。

1. 安装与初始化

import (
    "gorm.io/driver/mysql" // MySQL驱动
    "gorm.io/gorm"
)

// 初始化连接
dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
    panic("failed to connect database")
}

2. 定义模型(Model)

type User struct {
    gorm.Model        // 内嵌包含ID, CreatedAt, UpdatedAt, DeletedAt字段
    Name      string `gorm:"size:255"`
    Email     string `gorm:"uniqueIndex;not null"`
    Age       int
    IsActive  bool   `gorm:"default:true"`
}

// 表名自定义(可选)
func (User) TableName() string {
    return "app_users"
}

3. CRUD操作

创建记录

user := User{Name: "John", Email: "john@example.com"}
result := db.Create(&user) // 通过指针传递数据

if result.Error != nil {
    // 处理错误
}

fmt.Println(user.ID) // 获取自增ID

查询记录

// 获取第一条记录
var firstUser User
db.First(&firstUser)

// WHERE条件查询
var users []User
db.Where("age > ?", 18).Find(&users)

// IN条件查询
db.Where("name IN ?", []string{"John", "Jane"}).Find(&users)

更新记录

// Save会更新所有字段(包括零值)
db.First(&user)
user.Name = "New Name"
db.Save(&user)

// Update只更新指定字段(推荐)
db.Model(&user).Update("name", "New Name")

// Updates支持多字段更新(map或struct)
db.Model(&user).Updates(map[string]interface{}{"name": "New Name", "age":30})

删除记录

// Delete会设置DeletedAt时间(软删除)
db.Delete(&user)

// Unscoped强制物理删除(硬删除)
db.Unscoped().Delete(&user)

4. GORM高级特性

关联关系

一对一关系

type Profile struct {
    gorm.Model 
    UserID uint // Foreign key 
    Address string 
}

type User struct { 
    gorm.Model 
    Profile Profile `gorm:"foreignKey:UserID"` 
}

一对多关系

type Order struct { 
    gorm.Model  
    UserID uint  
} 

type User struct {  
   Orders []Order `gorm:"foreignKey:UserID"`  
}

多对多关系

type Role struct {  
   Users []*User `gorm:"many2many:user_roles;"`  
}  

type User struct {   
   Roles []*Role `gorm:"many2many:user_roles;"`   
}   

事务处理

tx := db.Begin()  

err := tx.Create(&order1).Error  
if err != nil {    
   tx.Rollback()    
   return err    
}    

err = tx.Update("status","paid").Where(...).Error    
if err != nil {     
   tx.Rollback()     
   return err     
}     

tx.Commit()

性能优化

  • 批量插入:使用CreateInBatches减少SQL执行次数。
  • 预加载:避免N+1问题,使用Preload预加载关联数据。
  • 连接池配置
sqlDB,_:= db.DB()   
sqlDB.SetMaxOpenConns(100)    
sqlDB.SetMaxIdleConns(10)     
sqlDB.SetConnMaxLifetime(time.Hour)

5.GORM最佳实践

1.始终检查错误:每个数据库操作都可能失败,必须检查错误。

2.避免SELECT*:明确指定需要的列以提高性能。

3.使用结构体标签控制行为

Field int `gorm:"column:cust_field;default:-1;not null"`

4.生产环境日志配置

newLogger:= logger.New(      
   log.New(os.Stdout,"\r\n",log.LstdFlags),      
   logger.Config{SlowThreshold:time.Second})   

db,err:= grom.Open(dsn,&grom.Config{Logger:newLogger})

5.版本迁移管理:结合GooseFlyway进行数据库版本控制。

如需更详细的特定场景示例或问题排查,可以进一步提问!


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24015

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?