Golang中关于GORM的讨论与使用体验

Golang中关于GORM的讨论与使用体验 大家好! 😊

你们中有人在项目中使用过 GORM 吗?项目复杂度无关紧要。 你们对它的看法如何?

从 GitHub 上的星标数量来看,它相当受欢迎。

谢谢!

6 回复

它非常棒且简单。你只需要理解它的工作原理。

更多关于Golang中关于GORM的讨论与使用体验的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Ashutosh_Rai:

这是处理关系型数据库的更好方法

…比什么更好?

相较于使用默认的SQL包来处理,这将使您的工作轻松许多。

是的,我还想建议一点:如果您对SQL优化查询有深入的了解,那么应该遵循它;否则,最好选择Gorm。

Alex Korban 撰写了一篇关于“试图在其目标语言中重新实现 SQL 的 ORM”的有趣博客文章。它并非专门针对 GORM,我甚至不确定 GORM 是否属于这类 ORM。但这篇博客文章仍然包含了一些有趣的观点。我非常赞成使用现代 SQL,而 ORM 可能会使这变得困难。

GitHub

jinzhu/gorm

面向 Golang 的卓越 ORM 库,致力于对开发者友好(v2 版本正在开发中,基于 master 分支的 PR 将不会被接受)- jinzhu/gorm

这是一种处理关系型数据库的更好方式,我已在个人项目中使用过。唯一需要注意或担心的是避免为同一个模型添加多个结构体,否则会非常混乱且容易出错。

是的,如果我们从一个预定义且稳固的架构开始,在项目中从头实现它,会非常有帮助且易于管理。我曾使用过多种语言的 ORM,如 PHP、Python 和 Go,这个 Gorm 包与它们非常相似,我们只需要理解包的文档,这在首次使用 Go 实现时非常有帮助。

在项目中使用过GORM,整体体验相当不错。以下是一些具体的使用示例和感受:

  1. 基础模型定义和自动迁移
type User struct {
    ID        uint   `gorm:"primary_key"`
    Name      string
    Age       int
    CreatedAt time.Time
}

// 自动迁移
db.AutoMigrate(&User{})
  1. 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)
  1. 关联关系处理
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)
  1. 事务支持
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()
  1. 钩子函数
func (u *User) BeforeCreate(tx *gorm.DB) error {
    u.CreatedAt = time.Now()
    return nil
}

GORM的链式调用设计让查询构建很直观,文档也比较全面。性能方面,在复杂查询时需要注意N+1问题,合理使用PreloadJoins可以优化。社区活跃,遇到问题通常能找到解决方案。

回到顶部