go-frame框架学习笔记

go-frame框架学习笔记

资料

go-frame
https://github.com/gogf/gf
https://goframe.org/pages/viewpage.action?pageId=1114119
https://goframe.org/pages/viewpage.action?pageId=43391262
3个参考案例
https://github.com/goflyfox/gmanager
https://github.com/XiaobinZhao/my-gf
https://github.com/gogf/focus-single

初步应用流程

1、定义数据结构,在数据库建表,配置config.yaml数据库、gf cli配置(另外建个目录放)

  • created_at、updated_at、deleted_at 有这几个字段时,启动时间记录和软删除
  • 字段名 不区分大小写,也会忽略特殊字符
  • 加上Unscoped()时忽略自动时间更新特性

2、使用gf gen dao生成 dao/do/entity

  • 一般生成的内容不需要、也尽量不去修改,避免下次生成覆盖
  • 目前了解到如果需要配置orm模型关联需要修改

3、在api/controller/service,model里的inputModel和outputModel等处写业务代码

新增

Insert:使用INSERT INTO语句进行数据库写入,如果写入的数据中存在主键或者唯一索引时,返回失败,否则写入一条新数据
InsertIgnore:用于写入数据时如果写入的数据中存在主键或者唯一索引时,忽略错误继续执行写入
InsertAndGetId:用于写入数据时并直接返回自增字段的ID

Id, err := dao.Asset.Ctx(ctx).Data(in).InsertAndGetId()

更新

Update用于数据的更新,往往需要结合Data及Where方法共同使用
注意,更新一般都需要使用事务来控制

dao.Asset.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
		_, err := dao.Asset.
			Ctx(ctx).
			Data(in).
			Where(dao.Asset.Columns().Id, in.Id).
			Update()
		return err
	})

删除

Delete方法用于数据的删除。

dao.Asset.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
		_, err := dao.Asset.Ctx(ctx).Where(dao.Asset.Columns().Id, id).Delete()
		return err
	})

查询及结果处理

条件查询

dao.Asset.Ctx(ctx).Where(dao.Asset.Columns().Id, id).Scan(&out)

All 用于查询并返回多条记录的列表/数组。

dao.Asset.Ctx(ctx).Where("id >= ?",1).All()

用struct或[]struct接收orm查询返回结果的映射规则:

  • struct中需要匹配的属性必须为公开属性(首字母大写)
  • 记录结果中键名会自动按照 不区分大小写 且 忽略-/_/空格符号 的形式与struct属性进行匹配
  • 如果匹配成功,那么将键值赋值给属性,如果无法匹配,那么忽略该键值
#批量接收
#List  []v1.AssetQueryRes
all.Structs(&out.List)

返回结果判断及处理:直接判断返回的数据是否为nil或者长度为0,或者使用IsEmpty/IsNil方法

r, err := g.Model("order").Where("status", 1).All()
if err != nil {
	return err
}
if len(r) == 0 {
    // 结果为空
}
r, err := g.Model("order").Where("status", 1).All()
if err != nil {
	return err
}
if r.IsEmpty() {
    // 结果为空
}

发布静态资源

#cmd.go增加参数
			s.SetFileServerEnabled(true)         // 打开静态文件服务
			s.SetIndexFolder(true)               // 打开文件目录
			s.AddSearchPath("/resource/public") // 添加静态资源目录,最好不要用setPath,容易覆盖其他配置,比如swagger

配置swagger-ui

引入swagger-ui资源

const (
	SwaggerUIPageContent = `
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <meta name="description" content="SwaggerUI"/>
  <title>SwaggerUI</title>
  <link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@latest/swagger-ui.css" />
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist@latest/swagger-ui-bundle.js" crossorigin></script>
<script>
	window.onload = () => {
		window.ui = SwaggerUIBundle({
			url:    '/api.json',
			dom_id: '#swagger-ui',
		});
	};
</script>
</body>
</html>

注册路由,和gf自带的redoc路由/swagger错开,否则会被覆盖

group.GET("/swagger-ui", func(r *ghttp.Request) {
					r.Response.Write(consts.SwaggerUIPageContent)
				})

你可能感兴趣的:(golang学习笔记,golang,学习,数据库)