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.版本迁移管理:结合Goose或Flyway进行数据库版本控制。
如需更详细的特定场景示例或问题排查,可以进一步提问!
内容由零声教学AI助手提供,问题来源于学员提问