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开发。