一、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)