searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

【Go语言】grom工具

2025-10-09 10:05:48
1
0

一、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"},
})

五、性能优化建议

  1. 关闭默认事务:db.SkipDefaultTransaction = true

  2. 使用预编译语句:db.PrepareStmt = true

  3. 合理配置连接池:

sqlDB, _ := db.DB()
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Hour)
 
 
0条评论
作者已关闭评论
c****k
8文章数
0粉丝数
c****k
8 文章 | 0 粉丝
原创

【Go语言】grom工具

2025-10-09 10:05:48
1
0

一、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"},
})

五、性能优化建议

  1. 关闭默认事务:db.SkipDefaultTransaction = true

  2. 使用预编译语句:db.PrepareStmt = true

  3. 合理配置连接池:

sqlDB, _ := db.DB()
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(time.Hour)
 
 
文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0