gorm框架实现CRUD操作|豆包MarsCode AI刷题

67 阅读3分钟

GORM(Go Object-Relational Mapping)是一个流行的Go语言ORM框架,它提供了一种近乎自然的数据库操作方式,允许开发者通过简单的Go代码来定义模型,然后GORM会自动处理数据库的创建、查询、更新和删除等操作。以下是GORM框架的一些关键特性和使用背景:

  1. 全功能ORM:GORM是一个全功能的ORM库,提供了包括事务、关联、迁移、预加载等高级功能。
  2. 易用性:GORM的API设计直观易懂,即使是ORM新手也能快速上手。
  3. 性能:GORM底层使用原生SQL,性能优越。
  4. 社区活跃:GORM拥有一个活跃的社区,不断有新功能和改进被加入。
  5. 自动迁移:自动迁移功能允许开发者定义数据模型,然后GORM会根据这些模型自动创建或更新数据库表结构。
  6. 多数据库支持:GORM支持多种常见的数据库系统,包括MySQL、PostgreSQL、SQLite 和 SQL Server等。
  7. 关系映射:GORM支持定义和处理数据库表之间的关系,包括一对一、一对多和多对多关系。
  8. 事务支持:GORM提供了对事务的完整支持,开发者可以在需要时使用事务来保证数据操作的原子性。
  9. 钩子函数:GORM允许在模型的生命周期中定义钩子函数,这些函数会在特定时刻自动执行。
  10. 灵活的查询功能:GORM提供了强大的查询功能,支持条件查询、链式查询和原生SQL查询。

GORM的安装非常简单,可以通过Go的包管理工具go get来安装

go get -u gorm.io/gorm 
go get -u gorm.io/driver/mysql
import(
  "gorm.io/driver/mysql"
	"gorm.io/gorm"
        )
dsn := "username:password@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

通过结构体操作数据库

1. 创建(Create)

创建新记录通常使用 Create 方法。如果你的模型中包含了自动增长的主键(如 gorm.Model),GORM 会自动处理主键的赋值。

type User struct {
    gorm.Model
    Name string
    Age  int
}

newUser := User{Name: "Alice", Age: 30}
result := db.Create(&newUser)
if result.Error != nil {
}

2. 读取(Read)

读取记录可以通过 FirstFindScan 等方法实现。

go
var user User User
result := db.First(&user, "id = ?", 1)
var users []User
result := db.Find(&users)

3. 更新(Update)

更新记录通常使用 Update 方法。你可以选择更新模型的所有字段或者只更新特定的字段。

go

db.Model(&user).Update("Name", "Bob")

db.Save(&user)

4. 删除(Delete)

删除记录使用 Delete 方法。

go

db.Delete(&user)

db.Where("age > ?", 30).Delete(&users)

事务(Transactions)

GORM 支持事务处理,确保一系列操作的原子性。

go
tx := db.Begin()
if err := tx.Create(&newUser).Error; err != nil {
    tx.Rollback()
    return
}
tx.Commit()

关联(Associations)

GORM 允许你定义和处理模型之间的关联。

go
tx := db.Begin()
if err := tx.Create(&post).Error; err != nil {
    tx.Rollback()
    return
}
tx.Create(&Comment{PostID: post.ID})
tx.Commit()

钩子(Hooks)

GORM 允许你在模型的生命周期中定义钩子函数,这些函数会在执行特定操作前后自动调用。

go
func (m *User) BeforeCreate(tx *gorm.DB) (err error) {
    m.Age += 1 // 自增
}

条件查询(Conditional Queries)

GORM 提供丰富的 API 来构建复杂的查询条件。

go
db.Where("age > ?", 20).Find(&users)

预加载(Preloading)

GORM 允许你在查询时预加载关联的模型。

go
db.Preload("Comments").Find(&posts)