GoZero 是一个高性能的微服务框架,它基于 Go 语言开发,提供了丰富的工具支持,能够帮助开发者快速构建可扩展、易维护的应用。Gorm 是 Go 语言中常用的 ORM 库,它帮助我们简化数据库操作,使用面向对象的方式进行增删改查操作。
本文将介绍如何在 GoZero 中接入 Gorm,并通过一个简单的实战案例来演示如何在 GoZero 框架中实现数据库的 CRUD(增删改查)操作。
### 1. 项目准备
首先,确保你的开发环境已经安装了 Go 语言和相关工具。你可以通过以下命令来检查 Go 的安装:
```bash
go version
```
然后,创建一个新的 Go 项目并进入项目目录:
```bash
mkdir gozero-gorm-demo
cd gozero-gorm-demo
```
### 2. 安装 GoZero 和 Gorm
使用 `go get` 安装 GoZero 和 Gorm。
```bash
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 创建数据库表
首先,创建数据库和用户表:```sql
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 的数据库连接。```go
// model/db.go
package modelimport ("github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql" // MySQL 驱动"log""time"
)var DB *gorm.DB// 初始化数据库连接
func InitDB() {var err errordsn := "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 标签。```go
// model/user.go
package modelimport "github.com/jinzhu/gorm"// User 用户模型
type User struct {gorm.ModelName 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 Userif err := DB.First(&user, id).Error; err != nil {return nil, err}return &user, nil
}// 获取所有用户
func GetAllUsers() ([]User, error) {var users []Userif 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` 文件,定义路由和请求方法。```txt
// 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 createUserpost /users@handler getUserget /users/{id}@handler getUsersget /users@handler updateUserput /users/{id}@handler deleteUserdelete /users/{id}
}
```
#### 5.2 生成 GoZero 代码
在项目根目录执行以下命令生成 GoZero 的代码框架:
```bash
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**```go
// handler/createUser.go
package handlerimport ("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.Userif 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**```go
// handler/getUser.go
package handlerimport ("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 服务,并初始化数据库连接。```go
// main.go
package mainimport ("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 服务:
```bash
go run main.go
```
### 7. 测试 API
使用 Postman 或 curl 测试 API:
- **创建用户:**
```bash
curl -X POST -d '{"name": "Alice", "age": 25,