GoZero框架接入数据库引擎Gorm 并实战:构建简单的 CRUD 业务API

1,043 阅读4分钟

GoZero 是一个高性能的微服务框架,它基于 Go 语言开发,提供了丰富的工具支持,能够帮助开发者快速构建可扩展、易维护的应用。Gorm 是 Go 语言中常用的 ORM 库,它帮助我们简化数据库操作,使用面向对象的方式进行增删改查操作。

image.png 本文将介绍如何在 GoZero 中接入 Gorm,并通过一个简单的实战案例来演示如何在 GoZero 框架中实现数据库的 CRUD(增删改查)操作。

image.png

1. 项目准备

首先,确保你的开发环境已经安装了 Go 语言和相关工具。你可以通过以下命令来检查 Go 的安装:

go version  

然后,创建一个新的 Go 项目并进入项目目录:

mkdir gozero-gorm-demo  
cd gozero-gorm-demo  

2. 安装 GoZero 和 Gorm

使用 go get 安装 GoZero 和 Gorm。

go get github.com/tal-tech/go-zero  
go get github.com/jinzhu/gorm  
go get github.com/jinzhu/gorm/dialects/mysql  

我们使用 MySQL 作为数据库,你可以根据自己的需要选择其他数据库(如 PostgreSQL 等)。安装完依赖后,我们就可以开始编写代码了。

3. 数据库模型设计

在这篇文章中,我们将构建一个简单的用户管理系统,包含对用户的 CRUD 操作。我们首先设计一个 User 模型,该模型包括 ID, Name, Age, 和 Email 字段。

3.1 创建数据库表

首先,创建数据库和用户表:

CREATE DATABASE gozero_demo;

USE gozero_demo;

CREATE TABLE users (  
  id INT AUTO_INCREMENT PRIMARY KEY,  
  name VARCHAR(100) NOT NULL,  
  age INT NOT NULL,  
  email VARCHAR(100) NOT NULL  
);  

4. 配置 Gorm 连接数据库

在项目中创建一个 model 包,专门处理数据库模型和 Gorm 的数据库操作。

4.1 创建数据库连接

model 目录下创建一个 db.go 文件,负责初始化 Gorm 的数据库连接。

// model/db.go  
package model

import (  
    "github.com/jinzhu/gorm"  
    _ "github.com/jinzhu/gorm/dialects/mysql" // MySQL 驱动  
    "log"  
    "time"  
)

var DB *gorm.DB

// 初始化数据库连接  
func InitDB() {  
    var err error  
    dsn := "root:root@tcp(127.0.0.1:3306)/gozero_demo?charset=utf8&parseTime=True&loc=Local"  
    DB, err = gorm.Open("mysql", dsn)  
    if err != nil {  
        log.Fatalf("failed to connect to database: %v", err)  
    }

    // 设置连接池等参数  
    DB.DB().SetMaxIdleConns(10)  
    DB.DB().SetMaxOpenConns(100)  
    DB.DB().SetConnMaxLifetime(30 * time.Minute)  
      
    DB.AutoMigrate(&User{}) // 自动迁移  
}

// 关闭数据库连接  
func CloseDB() {  
    err := DB.Close()  
    if err != nil {  
        log.Fatalf("failed to close database: %v", err)  
    }  
}  

4.2 创建 User 模型

model 目录下创建一个 user.go 文件,定义 User 结构体,并为其添加 Gorm 标签。

// model/user.go  
package model

import "github.com/jinzhu/gorm"

// User 用户模型  
type User struct {  
    gorm.Model  
    Name  string `gorm:"type:varchar(100);not null"`  
    Age   int    `gorm:"not null"`  
    Email string `gorm:"type:varchar(100);not null;unique"`  
}

// 创建用户  
func CreateUser(user *User) (*User, error) {  
    if err := DB.Create(user).Error; err != nil {  
        return nil, err  
    }  
    return user, nil  
}

// 获取用户  
func GetUserByID(id uint) (*User, error) {  
    var user User  
    if err := DB.First(&user, id).Error; err != nil {  
        return nil, err  
    }  
    return &user, nil  
}

// 获取所有用户  
func GetAllUsers() ([]User, error) {  
    var users []User  
    if err := DB.Find(&users).Error; err != nil {  
        return nil, err  
    }  
    return users, nil  
}

// 更新用户  
func UpdateUser(user *User) (*User, error) {  
    if err := DB.Save(user).Error; err != nil {  
        return nil, err  
    }  
    return user, nil  
}

// 删除用户  
func DeleteUser(id uint) error {  
    if err := DB.Delete(&User{}, id).Error; err != nil {  
        return err  
    }  
    return nil  
}  

5. 接入 GoZero

接下来,我们在 GoZero 框架中创建 API 路由和处理逻辑,实现场景中的增删改查操作。

5.1 定义 user API 结构体

api 目录下创建一个 user.api 文件,定义路由和请求方法。

// api/user.api  
type User struct {  
    ID    uint   `json:"id"`  
    Name  string `json:"name"`  
    Age   int    `json:"age"`  
    Email string `json:"email"`  
}

service user-api {  
    @handler createUser  
    post /users

    @handler getUser  
    get /users/{id}

    @handler getUsers  
    get /users

    @handler updateUser  
    put /users/{id}

    @handler deleteUser  
    delete /users/{id}  
}  

5.2 生成 GoZero 代码

在项目根目录执行以下命令生成 GoZero 的代码框架:

go run github.com/tal-tech/go-zero/tools/goctl api go -api api/user.api -dir .  

这会生成处理 API 请求的代码。GoZero 会为我们自动生成 handler 和 logic 等文件。

5.3 实现 handler 和逻辑

在生成的 handler 目录下,我们实现具体的业务逻辑。

handler/createUser.go

// handler/createUser.go  
package handler

import (  
    "context"  
    "gozero-gorm-demo/model"  
    "gozero-gorm-demo/rpc/user"  
    "github.com/tal-tech/go-zero/rest/httpx"  
    "net/http"  
    "strconv"  
)

func CreateUser(ctx context.Context, w http.ResponseWriter, r *http.Request) {  
    var req user.User  
    if err := httpx.Parse(r, &req); err != nil {  
        httpx.Error(w, err)  
        return  
    }

    user := &model.User{  
        Name:  req.Name,  
        Age:   req.Age,  
        Email: req.Email,  
    }

    createdUser, err := model.CreateUser(user)  
    if err != nil {  
        httpx.Error(w, err)  
        return  
    }

    httpx.OkJson(w, createdUser)  
}  

handler/getUser.go

// handler/getUser.go  
package handler

import (  
    "context"  
    "gozero-gorm-demo/model"  
    "github.com/tal-tech/go-zero/rest/httpx"  
    "net/http"  
    "strconv"  
)

func GetUser(ctx context.Context, w http.ResponseWriter, r *http.Request) {  
    idStr := r.URL.Query().Get("id")  
    id, err := strconv.Atoi(idStr)  
    if err != nil {  
        httpx.Error(w, err)  
        return  
    }

    user, err := model.GetUserByID(uint(id))  
    if err != nil {  
        httpx.Error(w, err)  
        return  
    }

    httpx.OkJson(w, user)  
}  

5.4 启动服务

最后,在 main.go 文件中启动 GoZero 服务,并初始化数据库连接。

// main.go  
package main

import (  
    "fmt"  
    "gozero-gorm-demo/model"  
    "gozero-gorm-demo/handler"  
    "github.com/tal-tech/go-zero/rest"  
)

func main() {  
    model.InitDB()  
    defer model.CloseDB()

    server := rest.MustNewServer(rest.RestConf{  
        Port: 8080,  
    })  
    defer server.Stop()

    server.AddRoute(rest.Route{  
        Method:  "POST",  
        Path:    "/users",  
        Handler: handler.CreateUser,  
    })  
    server.AddRoute(rest.Route{  
        Method:  "GET",  
        Path:    "/users/{id}",  
        Handler: handler.GetUser,  
    })

    fmt.Println("Starting server on port 8080...")  
    server.Start()  
}  

6. 运行项目

确保数据库已启动,并且已正确创建用户表后,运行 GoZero 服务:

go run main.go  

7. 测试 API

使用 Postman 或 curl 测试 API:

  • 创建用户:
curl -X POST -d '{"name": "Alice", "age": 25,