后端实践:使用GORM对数据库进行增删改查(二)文件配置|青训营;

80 阅读3分钟

今天我们来讲述其中各个文件的配置。这是每一个项目都必不可少的基础业务,也是我们使用框架的起点。只有配置好了文件,我们才能成功调用接口。本文阅读需要一定的数据库基础。

项目的后端分层

在完成工程的时候,我们需要注意项目工程的分层。大体项目的后端应该分为三层:Entity(实体)、Service(服务层)、Controller(控制层)。

1691998355744.png

1691998397202.png

一个项目的整体工程安排可以如图所示,我们在进行查询之前,理应配置好其它环境,在这方面我建议是去找开源代码,在此处就不多加赘述了,仅仅简单提一下每一个文件的需要:

层名作用
Controller控制层,决定业务逻辑以及在其中的属性传递方式
Service利用函数生成对应的SQL语句,和数据库相连后执行命令。
Public一些数据
Test测试文件,里面含有单元测试等测试所用代码。
.mod引入的各种框架代码版本
.sum引入的所有框架代码
router每一个执行接口的路径和方法
main主程序,在这里启动数据库的连接

方式

不管是增删改查当中的哪一个,前提都是,我们要在数据库中建立一个表。好在go语言为我们提供了建立表格的方式。

设定Entity类

那么,这个表有几列?这些列的约束是什么?有没有主键?这些问题都是我们逃避不开的选项。 设定这些的关键就在于设定实体类(Entity)。 假设我们现在要给一个视频做评论,那么这个表格需要哪些内容?

  1. 评论id,这也要作为主键
  2. 发布这个评论的用户
  3. 这条评论所在的视频
  4. 这条评论的具体内容
  5. 这条评论发布的时间

大家可以看看下面的代码,它表示这一评论类的定义:

package Entity

type CommentEntity struct {
	CommentId string `gorm:"primaryKey"`
	UserId    int
	VideoId   int
	Content   string
	Calendar  string 
}

生成数据库表

我们可以看到,这个结构体很容易就表现出来了,下面是建立表格的时刻,也是gorm发挥作用的时候:

package CommentDbService

var Db *gorm.DB

func ConnectDb() {
	var (
		err error
	)
	dbConfig := ConfigService.GetAppConfig("database")
	connectStr := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local", dbConfig.USER,
		dbConfig.PASSWORD,
		dbConfig.HOST, dbConfig.NAME)
	Db, err = gorm.Open(mysql.Open(connectStr), &gorm.Config{})
	if err != nil {
		panic(err)
	}

	// 自动生成表结构
	dbErr1 := Db.AutoMigrate(&Entity.CommentEntity{})
	if dbErr1 != nil {
		println(err)
	}
}

连接数据库

我们知道,连接数据库需要用户名(身份,最好不要是root)、密码、具体哪个数据库等信息,这些信息我们可以在.ini文件中定义:

#客户端访问服务端所用到的端口号
[server]
HTTP_PORT = :9180

[database]
#数据库种类
TYPE = mysql
#用户名
USER = yrb
#密码
PASSWORD =yrb
#localhost:3306  数据库IP:数据库端口号
HOST = localhost:3306
#数据库名称
NAME = go

运行

这样,再在main函数中调用并运行:

CommentDBService.ConnectDb()

我们就会发现数据库中多了一个表:

1692001025666.png

考虑响应成功后传递的信息

根据我们相应的要求不同,传递的信息也有所不同。这里用到了gin框架: 比如:

// 参数错误响应
func ArgErrApiResult(c *gin.Context, argName string) {
	c.JSON(SUCCESS, &ResponseResult{
		Result: false,
		Msg:    fmt.Sprintf("参数【%s】有误", argName),
		Code:   SUCCESS,
		Data:   nil,
	})
}

此处可以不做赘述。