GoFrame框架中的ORM使用指南

648 阅读3分钟

GoFrame是一个模块化、松耦合、轻量级、高性能的Go语言Web开发框架。其中gdb包提供了非常强大便捷的ORM功能。本文将介绍如何在GoFrame项目中使用gorm进行数据库操作。

配置数据库连接

要使用orm,首先需要配置数据库连接信息。在config.yaml中进行如下配置:

database:
  default:
    link: "mysql:root:12345678@tcp(127.0.0.1:3306)/test"
    debug: true

其中link为数据库连接串,debug设为true可以在控制台打印出执行的SQL语句,便于调试。

定义数据模型

使用ORM需要定义Go结构体来映射数据库表。例如user表:

type User struct {
    Id       int    `orm:"id"`
    Name     string `orm:"name"`     
    Password string `orm:"password"`
    Status   int    `orm:"status"`
}

通过结构体的tag标签orm来设置字段映射关系,如主键、默认值等。

创建数据

user := &User{
    Name:     "john",
    Password: "123456",
}
db := g.DB()
result, err := db.Model("user").Ctx(ctx).Insert(user)

使用g.DB()获取数据库连接对象db,然后调用Insert方法插入数据。

查询数据

db := g.DB()
user := &User{}
err := db.Model("user").Ctx(ctx).Where("id=?", 1).Scan(user)

使用db.Table指定表名,Where设置查询条件,Scan将结果读取到结构体对象中。

还可以进行复杂的查询:

users := make([]*User,0)
err := db.Model("user").Ctx(ctx).Where("name like ?", "john%").Order("id asc").Scan(&users)

使用数组来接收多行数据,并可以使用Order等方法进行排序等操作。

更新数据

db := g.DB()  
result, err := db.Model("user").Ctx(ctx).Where("id=?", 1).Update(&User{
    Name: "john",
})

Update方法可传入一个结构体指针,将会更新非零值的字段。

删除数据

db := g.DB()
result, err := db.Model("user").Ctx(ctx).Where("id=?", 1).Delete()

调用Delete方法可删除数据,支持软删除。

事务操作

db := g.DB().Begin() 
result, err := db.Model("user").Ctx(ctx).Insert(&User{
    Name: "john",
})
if err != nil {
    db.Rollback()
} else {
    db.Commit()
}

使用db.Begin()开启事务,Commit提交事务,Rollback回滚事务,与原生SQL类似。

一对一关联

一对一是最基本的关联关系,如一个用户对应一个用户详情。可以使用orm:"with:id=user_id"标签来定义一对一关联:

type User struct {
    g.Meta `orm:"table:user"`
    Id   int    `orm:"id"`
    Name string `orm:"name"` 
    
    Detail *UserDetail `orm:"with:id=user_id"`
}

type UserDetail struct {
    g.Meta `orm:"table:user_detail"`
    Id     int    `orm:"id"` 
    UserId int    `orm:"user_id"`
    Email  string `orm:"email"`
}

查询时会自动关联查出对应的UserDetail数据:

user := &User{}
err := g.DB().Model("user").Ctx(ctx).Where("id", 1).WithAll().Scan(user)
// user.Detail中就包含了关联的UserDetail数据

一对多关联

一对多关联如一个用户可以有多条评论,可以使用orm:"with:comments"定义:

type User struct {
    g.Meta `orm:"table:user"`
    Id   int    `orm:"id"`
    Name string `orm:"name"`
    
    Comments []*Comment `orm:"with:id=user_id"`  
}

type Comment struct {
    g.Meta `orm:"table:comments"`
    Id      int    `orm:"id"`
    UserId  int    `orm:"user_id"`
    Content string `orm:"content"`   
}

查询时会关联查出该用户的所有评论数据:

user := &User{}
err := g.DB().Model("user").Ctx(ctx).Where("id", 1).WithAll().Scan(user)
// user.Comments中就包含了该用户的所有评论数据

多对多关联

多对多关联需要一个中间表来存储关联关系,如学生与课程的选课关系,需要定义如下:

type Student struct {
    g.Meta `orm:"table:student"`
    Id   int    `orm:"id"` 
    Name string `orm:"name"`
    
    Courses []*Course `orm:"with:id=id"` // 与Course多对多关联
}

type Course struct {
    g.Meta `orm:"table:course"`
    Id   int    `orm:"id"`
    Name string `orm:"name"`   
    
    Students []*Student `orm:"with:id=id"` // 与Student多对多关联
}

type StudentCourse struct {
    g.Meta `orm:"table:student_course"`
    Id         int `orm:"id"`
    StudentId  int `orm:"student_id"`  // 中间表通过2个外键连接Student表和Course表
    CourseId   int `orm:"course_id"`
}

查询时可以关联查出多对多关系数据:

student := &Student{}
err := g.DB().Model("student").Ctx(ctx).Where("id",1).WithAll().Scan(student)
// student.Courses中就是该学生选修的所有课程

course := &Course{}  
err := g.DB().Model("course").Ctx(ctx).Where("id",1).WithAll().Scan(course)
// course.Students中就是选修该课程的所有学生

orm会自动帮我们处理多对多关联的中间表数据,非常方便。

总结

以上就是GoFrame框架中使用gdb进行ORM开发的主要内容和步骤,了解这些可以让我们方便的进行数据库操作。GoFrame提供的这套ORM功能强大灵活,结合其他特性可以让我们更加高效的进行Web开发。