GoZero 是一个高性能的微服务框架,它基于 Go 语言开发,提供了丰富的工具支持,能够帮助开发者快速构建可扩展、易维护的应用。Gorm 是 Go 语言中常用的 ORM 库,它帮助我们简化数据库操作,使用面向对象的方式进行增删改查操作。
本文将介绍如何在 GoZero 中接入 Gorm,并通过一个简单的实战案例来演示如何在 GoZero 框架中实现数据库的 CRUD(增删改查)操作。
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,