一、GORM简介
GORM是Go语言生态中最受欢迎的ORM框架之一,具有以下核心优势:
-
全功能ORM支持
-
开发者友好API设计
-
完善的关联关系处理
-
支持主流数据库(MySQL/PostgreSQL/SQLite/SQL Server)
-
提供事务、迁移、钩子等高级特性
二、快速开始
1. 安装与配置
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql // 以MySQL为例
// 初始化连接
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
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{})
}
2. 模型定义
type User struct {
gorm.Model // 内嵌包含ID, CreatedAt等字段
Name string `gorm:"type:varchar(100);uniqueIndex"`
Email string `gorm:"not null"`
Age int `gorm:"default:18"`
IsActive bool `gorm:"index"`
}
// 表名自定义
func (User) TableName() string {
return "user_profiles"
}
三、核心CRUD操作
1. 创建记录
// 单条创建
user := User{Name: "Alice", Email: "alice@example.com"}
result := db.Create(&user)
// 批量插入
users := []User{
{Name: "Bob", Email: "bob@example.com"},
{Name: "Charlie", Email: "charlie@example.com"},
}
db.CreateInBatches(users, 100) // 每批100条
2. 查询操作
基础查询:
// 获取单条记录
var user User
db.First(&user) // 按主键排序第一条
db.Take(&user) // 随机一条
db.Last(&user) // 按主键排序最后一条
// 条件查询
db.Where("age > ?", 25).Find(&users)
db.Where(map[string]interface{}{"is_active": true}).Find(&users)
高级查询:
// 预加载关联数据
db.Preload("Orders").Find(&users)
// 分页查询
db.Limit(10).Offset((page - 1) * 10).Find(&users)
// 选择特定字段
db.Select("name", "email").Find(&users)
3. 更新操作
// 全量更新
db.Model(&user).Updates(User{Name: "NewName", Age: 30})
// 选择性更新
db.Model(&user).Select("Name").Updates(User{Name: "NewName", Age: 30}) // 只更新Name
db.Model(&user).Omit("Age").Updates(User{Name: "NewName", Age: 30}) // 排除Age字段
// 批量更新
db.Model(User{}).Where("age < ?", 20).Update("is_active", false)
4. 删除操作
// 物理删除
db.Delete(&user)
// 软删除(需要模型包含DeletedAt字段)
db.Where("age < ?", 18).Delete(&User{})
// 查询时排除已删除记录
db.Where("name = ?", "Alice").Find(&user)
四、高级特性
1. 事务处理
db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(&user).Error; err != nil {
return err
}
if err := tx.Model(&account).Update("balance", gorm.Expr("balance - ?", 100)).Error; err != nil {
return err
}
return nil
})
2. 钩子函数
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
u.UUID = uuid.New() // 创建前生成UUID
return
}
func (u *User) AfterDelete(tx *gorm.DB) (err error) {
log.Printf("用户 %s 已被删除", u.Name)
return
}
3. 关联关系处理
type User struct {
gorm.Model
Profile Profile
Orders []Order
}
type Profile struct {
gorm.Model
UserID uint
Address string
}
// 自动创建关联数据
db.Create(&User{
Name: "David",
Profile: Profile{Address: "123 Main St"},
})
五、性能优化建议
-
关闭默认事务:
db.SkipDefaultTransaction = true
-
使用预编译语句:
db.PrepareStmt = true
-
合理配置连接池:
sqlDB, _ := db.DB()
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Hour)