go-admin框架分析(4—1)访问数据库查询

代码还是在db分支,相关业务代码全部在app/other目录下

上一篇分析完了数据库的连接。这篇就是实现代码来印证一下。

首先呢,这里的数据来源是go-admin官方提供的初始化导入的。我的数据库取名叫做“go_admin”。说实话,我看看它自带的那些业务代码,一个简简单单的get查询,都实现得很复杂似的。其中好几个方法,都是知道到底在干吗,查资料后,我删掉了大部分代码。留下一些好理解的。

我取其中的一个接口 “getPage”做实践。
首先看page的接口层:

它首先是为了提供对外的接口,然后再做一些基本的检查,然后将db,logger等对象传递给业务实现层。

// go-admin框架下 接口层必备结构体
type SysApi struct {
	api.Api
}

func (e SysApi) GetPage(c *gin.Context) {
	// 业务实现层对象
	s := service.SysApi{}
	// 这里的链式操作是为了检查各所需的对象是否正确初始化,基本上每个接口都带有这一串玩意。实际上是将所需的对象传递到需要的位置
	err := e.MakeContext(c). // 这里是为了将gin.Context这个http连接实例赋值给SysApi这个对象,并且为它获取了日志的对象以过程中的日志操作
					MakeOrm().               // 为了获取db对象,并将指针拷贝给SysApi的对象
					MakeService(&s.Service). // 这一步是将上面获取日志对象和db对象赋值给业务实现层对象s,然后由它去完成操作。
					Errors                   // 过程中如果有哪一步有错,就会提取到错误,否则err为 nil
	// 判断是否有错
	if err != nil {
		e.Logger.Error(err)
		e.Error(500, err, err.Error())
		return
	}
	list := make([]models.SysApi, 0) // 储存从数据库获取的数据的列表
	err = s.GetPage(&list)           //获取数据的实现
	if err != nil {
		e.Error(500, err, "查询失败")
		return
	}
	e.OK(list, "查询成功")
}

业务实现在service文件夹的page.go:

// go-admin 封装的业务实现层必备结构体
type SysApi struct {
	service.Service
}

// GetPage 获取SysApi列表
func (e *SysApi) GetPage(list *[]models.SysApi) error {
	var err error
	var data models.SysApi // page对应表的映射结构体

	err = e.Orm.Debug().Model(&data).Limit(1).Find(list).Error // 这里就是查询满足条件的第一条数据
	if err != nil {
		e.Log.Errorf("Service GetSysApiPage error:%s", err)
		return err
	}
	return nil
}

有没有发现这个查询过程没有提到表名,也没提到字段名,那它怎么查呢?其实都是通过Model(&data)获取到这些信息的。我们就讲models.SysApi这个结构体吧。

// page 对应表的映射,后面这些标签,为了查询数据和转换大小写
type SysApi struct {
	Id        int            `json:"id" gorm:"primaryKey;autoIncrement;comment:主键编码"`
	Handle    string         `json:"handle" gorm:"size:128;comment:handle"`
	Title     string         `json:"title" gorm:"size:128;comment:标题"`
	Path      string         `json:"path" gorm:"size:128;comment:地址"`
	Action    string         `json:"action" gorm:"size:16;comment:请求类型"`
	Type      string         `json:"type" gorm:"size:16;comment:接口类型"`
	CreatedAt time.Time      `json:"createdAt" gorm:"comment:创建时间"`
	UpdatedAt time.Time      `json:"updatedAt" gorm:"comment:最后更新时间"`
	DeletedAt gorm.DeletedAt `json:"-" gorm:"index;comment:删除时间"`
	CreateBy  int            `json:"createBy" gorm:"index;comment:创建者"`
	UpdateBy  int            `json:"updateBy" gorm:"index;comment:更新者"`
}

首先在go的规范里,字段要想对外暴露,首字母必须大写。否则无法正确解析。但是业界的命名规范通常都是小写字母开头,于是就需要json标签,可以看到就是把首字母换小写,个别比较特别的可以去查下什么含义。

但是我们还知道,数据库里字段命名规范通常又采用下划线的方式,所以这里还要做一次转换,但是这个转换gorm帮我们完成了。所以就能对应上数据库上的字段了。

这个过程中还缺了很重要的一个因素,表名都没有呀,其实gorm也有默认规则,表名也默认是结构体的名字,它也会默认转化成下划线的格式。所以,整个查询就这样完成的。当然,字段要加入gorm标签才行。

PS:我这里省略了路由没有描述,接口要对外暴露,自然是需要添加到路由中。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsjweiyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值