Golang中关于GORM的讨论与使用体验
Golang中关于GORM的讨论与使用体验 大家好! 😊
你们中有人在项目中使用过 GORM 吗?项目复杂度无关紧要。 你们对它的看法如何?
从 GitHub 上的星标数量来看,它相当受欢迎。
谢谢!
6 回复
它非常棒且简单。你只需要理解它的工作原理。
更多关于Golang中关于GORM的讨论与使用体验的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Ashutosh_Rai:
这是处理关系型数据库的更好方法
…比什么更好?
Alex Korban 撰写了一篇关于“试图在其目标语言中重新实现 SQL 的 ORM”的有趣博客文章。它并非专门针对 GORM,我甚至不确定 GORM 是否属于这类 ORM。但这篇博客文章仍然包含了一些有趣的观点。我非常赞成使用现代 SQL,而 ORM 可能会使这变得困难。
在项目中使用过GORM,整体体验相当不错。以下是一些具体的使用示例和感受:
- 基础模型定义和自动迁移:
type User struct {
ID uint `gorm:"primary_key"`
Name string
Age int
CreatedAt time.Time
}
// 自动迁移
db.AutoMigrate(&User{})
- CRUD操作简洁性:
// 创建
user := User{Name: "John", Age: 30}
db.Create(&user)
// 查询
var result User
db.First(&result, 1) // 根据ID查询
db.Where("age > ?", 25).Find(&users)
// 更新
db.Model(&user).Update("Age", 31)
// 删除
db.Delete(&user)
- 关联关系处理:
type Company struct {
ID uint
Name string
}
type Employee struct {
ID uint
Name string
CompanyID uint
Company Company `gorm:"foreignKey:CompanyID"`
}
// 预加载关联数据
db.Preload("Company").Find(&employees)
- 事务支持:
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Create(&user1).Error; err != nil {
tx.Rollback()
return
}
if err := tx.Create(&user2).Error; err != nil {
tx.Rollback()
return
}
tx.Commit()
- 钩子函数:
func (u *User) BeforeCreate(tx *gorm.DB) error {
u.CreatedAt = time.Now()
return nil
}
GORM的链式调用设计让查询构建很直观,文档也比较全面。性能方面,在复杂查询时需要注意N+1问题,合理使用Preload和Joins可以优化。社区活跃,遇到问题通常能找到解决方案。


