GO - ZERO 操作 MySQL:从入门到实践

目录

GO - ZERO 操作 MySQL:从入门到实践

一、创建项目结构与数据库相关准备

二、生成 GO 代码

三、配置数据库连接

四、在 API 中使用数据库操作

五、自定义查询方法

六、运行项目并测试


在使用 GO - ZERO 框架进行开发时,与 MySQL 数据库的交互是常见且重要的操作。本文将详细介绍如何使用 GO - ZERO 原生操作 MySQL,包括创建数据库、表,生成代码,配置连接,进行增删改查操作以及自定义查询等步骤,并附上相应的代码示例。

一、创建项目结构与数据库相关准备

  1. 创建项目目录
    • 新建一个名为model_study(可根据实际需求命名)的目录,用于存放与模型和数据库操作相关的文件。
    • model_study目录下创建model目录,用于存放模型相关代码。
  2. 创建 SQL 文件并定义表结构
    • model目录下创建user.sql文件,用于定义用户表结构。
    • 示例代码如下:

Create table user (
    id INT PRIMARY KEY,
    username VARCHAR(255),
    password VARCHAR(255),
    INDEX(username)
);

  • 此代码创建了一个名为user的表,包含id(主键)、usernamepassword字段,并为username字段创建了索引。

  1. 创建数据库并导入表结构
    • 打开终端,使用 MySQL 命令行连接到 MySQL 服务器(假设用户名是root,密码是root,端口为3307)。
    • 执行以下命令创建数据库:

CREATE DATABASE zero_db;

  • 选择创建的数据库:

USE zero_db;

  • 导入user.sql文件中的表结构:

SOURCE /path/to/user.sql;

  • (注意:将/path/to/user.sql替换为实际的user.sql文件路径)。此时,数据库和表结构已准备就绪。

二、生成 GO 代码

  1. 使用 goctl 生成代码
    • 在终端中,进入model目录(确保已安装goctl工具)。
    • 执行以下命令生成与 MySQL 操作相关的 GO 代码:

goctl model mysql ddl -src user.sql -dir.

  • 此命令会根据user.sql中的表定义生成user.model文件,其中包含了基本的增删改查方法,如FindOneDeleteInsert等,但不包含查询所有数据的方法。

三、配置数据库连接

  1. 在配置文件中添加 MySQL 配置
    • 在项目的配置文件(假设为config.yaml)中添加以下 MySQL 配置内容:
mysql:
  dataSource: root:root@tcp(127.0.0.1:3307)/zero_db?charset=utf8mb4&parseTime=True&loc=Local

  • 这里配置了 MySQL 的数据源,包括用户名、密码、地址、端口、数据库名以及字符集等信息。根据实际情况修改用户名、密码和端口号等。

四、在 API 中使用数据库操作

  1. 创建 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]

  • 此注释定义了接口的基本信息,包括接口功能、请求参数、响应数据结构和路由等。

  1. 生成 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方法查询用户信息,如果查询失败,根据错误类型返回相应的错误信息。如果查询成功,返回登录成功的响应信息。

五、自定义查询方法

  1. 在 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结构体中并返回。如果查询过程中出现错误,将错误信息返回。

六、运行项目并测试

  1. 启动 API 服务
    • 在项目根目录执行以下命令启动 API 服务:

go run user.go

  • (假设user.go是项目的入口文件,根据实际情况调整)。

  1. 使用工具测试接口(以 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 的交互操作。