目录
在使用 GO - ZERO 框架进行开发时,与 MySQL 数据库的交互是常见且重要的操作。本文将详细介绍如何使用 GO - ZERO 原生操作 MySQL,包括创建数据库、表,生成代码,配置连接,进行增删改查操作以及自定义查询等步骤,并附上相应的代码示例。
一、创建项目结构与数据库相关准备
- 创建项目目录
- 新建一个名为
model_study
(可根据实际需求命名)的目录,用于存放与模型和数据库操作相关的文件。 - 在
model_study
目录下创建model
目录,用于存放模型相关代码。
- 新建一个名为
- 创建 SQL 文件并定义表结构
- 在
model
目录下创建user.sql
文件,用于定义用户表结构。 - 示例代码如下:
- 在
Create table user (
id INT PRIMARY KEY,
username VARCHAR(255),
password VARCHAR(255),
INDEX(username)
);
- 此代码创建了一个名为
user
的表,包含id
(主键)、username
和password
字段,并为username
字段创建了索引。
- 创建数据库并导入表结构
- 打开终端,使用 MySQL 命令行连接到 MySQL 服务器(假设用户名是
root
,密码是root
,端口为3307
)。 - 执行以下命令创建数据库:
- 打开终端,使用 MySQL 命令行连接到 MySQL 服务器(假设用户名是
CREATE DATABASE zero_db;
- 选择创建的数据库:
USE zero_db;
- 导入
user.sql
文件中的表结构:
SOURCE /path/to/user.sql;
- (注意:将
/path/to/user.sql
替换为实际的user.sql
文件路径)。此时,数据库和表结构已准备就绪。
二、生成 GO 代码
- 使用 goctl 生成代码
- 在终端中,进入
model
目录(确保已安装goctl
工具)。 - 执行以下命令生成与 MySQL 操作相关的 GO 代码:
- 在终端中,进入
goctl model mysql ddl -src user.sql -dir.
- 此命令会根据
user.sql
中的表定义生成user.model
文件,其中包含了基本的增删改查方法,如FindOne
、Delete
、Insert
等,但不包含查询所有数据的方法。
三、配置数据库连接
- 在配置文件中添加 MySQL 配置
- 在项目的配置文件(假设为
config.yaml
)中添加以下 MySQL 配置内容:
- 在项目的配置文件(假设为
mysql:
dataSource: root:root@tcp(127.0.0.1:3307)/zero_db?charset=utf8mb4&parseTime=True&loc=Local
- 这里配置了 MySQL 的数据源,包括用户名、密码、地址、端口、数据库名以及字符集等信息。根据实际情况修改用户名、密码和端口号等。
四、在 API 中使用数据库操作
- 创建 API 文件并定义接口(以用户登录为例)
- 在项目中创建
user.api
文件,定义用户登录接口。 - 示例代码如下:
- 在项目中创建
// 用户登录接口
// @Summary 用户登录
// @Description 用户通过提供用户名和密码进行登录
// @Tags 用户管理
// @Accept json
// @Produce json
// @Param username body string true "用户名"
// @Param password body string true "密码"
// @Success 200 {object} types.LoginResponse "登录成功"
// @Router /Api/user/login [post]
- 此注释定义了接口的基本信息,包括接口功能、请求参数、响应数据结构和路由等。
- 生成 API 代码并编写登录逻辑
- 使用
goctl
命令将user.api
文件转换为对应的 GO 代码(假设在项目根目录执行):
- 使用
goctl api go -api user.api -dir.
- 在生成的
user/login/logic/userloginlogic.go
文件中编写登录逻辑,实现连接数据库并验证用户信息的功能。 - 示例代码如下:
package logic
import (
"context"
"model_study/api/internal/svc"
"model_study/api/internal/types"
"model_study/model"
"gorm.io/gorm"
)
type UserLoginLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewUserLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserLoginLogic {
return &UserLoginLogic{
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *UserLoginLogic) UserLogin(req *types.LoginRequest) (resp *types.LoginResponse, err error) {
// 获取MySQL连接
db := l.svcCtx.Config.Mysql.DataSource
sqlDB, err := gorm.Open(mysql.Open(db), &gorm.Config{})
if err!= nil {
return nil, err
}
// 创建user model实例并传入连接
userModel := model.UserModel{DB: sqlDB}
// 查询用户信息(自定义查询方法)
user, err := userModel.FindOneByUsernameAndPassword(req.Username, req.Password)
if err!= nil {
if err == gorm.ErrRecordNotFound {
return nil, types.ErrLoginFailed
}
return nil, err
}
return &types.LoginResponse{
Code: 0,
Message: "登录成功",
Data: types.LoginData{
Userid: user.ID,
Username: user.Username,
},
}, nil
}
- 在上述代码中,首先获取配置文件中的 MySQL 连接信息,打开数据库连接,创建
user.model
实例并传入连接。然后调用自定义的FindOneByUsernameAndPassword
方法查询用户信息,如果查询失败,根据错误类型返回相应的错误信息。如果查询成功,返回登录成功的响应信息。
五、自定义查询方法
- 在 user.model 文件中添加自定义查询
- 打开
user.model
文件,添加FindOneByUsernameAndPassword
方法,用于根据用户名和密码查询用户信息。 - 示例代码如下:
- 打开
func (m *UserModel) FindOneByUsernameAndPassword(username string, password string) (*User, error) {
var user User
query := fmt.Sprintf("SELECT * FROM user WHERE username = '%s' AND password = '%s' LIMIT 1", username, password)
err := m.DB.Raw(query).Scan(&user).Error
if err!= nil {
return nil, err
}
return &user, nil
}
- 此方法使用原生 SQL 查询根据用户名和密码查找用户信息,将查询结果扫描到
User
结构体中并返回。如果查询过程中出现错误,将错误信息返回。
六、运行项目并测试
- 启动 API 服务
- 在项目根目录执行以下命令启动 API 服务:
go run user.go
- (假设
user.go
是项目的入口文件,根据实际情况调整)。
- 使用工具测试接口(以 APIFox 为例)
- 打开 APIFox,创建一个新的请求。
- 配置请求地址为
http://127.0.0.1:8888/Api/user/login
(端口号根据实际配置而定),请求方法为POST
。 - 在请求体中输入用户名和密码,如
{"username":"峰峰","password":"123456"}
。 - 发送请求,如果用户名和密码正确,将返回登录成功的信息,否则返回登录失败的信息。
通过以上步骤,我们实现了使用 GO - ZERO 原生操作 MySQL 的基本功能,包括创建数据库、表,生成代码,配置连接,编写自定义查询以及在 API 中进行数据库操作等。然而,正如视频中提到的,这种原生操作在某些情况下可能会比较繁琐,特别是对于复杂的查询。在下一篇博客中,我们将探讨如何将更方便的 ORM 库(如 GORM)与 GO - ZERO 结合使用,以提高数据库操作的效率和便利性。希望本文能够帮助大家更好地理解和应用 GO - ZERO 与 MySQL 的交互操作。