一、前提提要

1、ent框架:是一个操控数据库的orm框架,类似python中的sqlalchemy来操作数据库

2、据说非常适合处理各种复杂关系(我也不知道是真是假,不过好用是真的)

3、安装:go get entgo.io/ent/cmd/entc(如果不行 go install entgo.io/ent/cmd/ent@latest)

4、引用别人的一个概念:

(1)Schema:描述一个实体的定义以及他与其他实体的关系,类似python里用sqlalchemy创建的modul,就是数据表的一个描述

(2)Edges:实体与实体之间的关系称为edge

4、常用命令:

  • 创建一个Schema:ent init --target ent/schema User(在当前目录下的,ent/schema目录下创建一个User.go文件,用于待会创建一个数据表)
  • 生成代码:ent generate ./ent/schema

二、代码说明

1、运行:ent init --target ent/schema User 命令后,生成的User.go文件进行编辑

package schemaimport ("entgo.io/ent""entgo.io/ent/schema/field"
)// User holds the schema definition for the User entity.
type User struct {ent.Schema
}// Fields of the User. 用户字段
func (User) Fields() []ent.Field {return []ent.Field{// 年龄整数field.Int("age").Positive(),// 姓名为字符串field.String("name").Default("unknown"),}
}// Edges of the User.用户表关系
func (User) Edges() []ent.Edge {return []ent.Edge{}
}

2、运行:ent generate ./ent/schema 生成代码,目录结构如下

ent
├── client.go
├── config.go
├── context.go
├── ent.go
├── migrate
│   ├── migrate.go
│   └── schema.go
├── predicate
│   └── predicate.go
├── schema // 这个就是用来描述表的目录,其他的都是自动生成的
│   └── user.go
├── tx.go
├── user
│   ├── user.go
│   └── where.go
├── user.go
├── user_create.go
├── user_delete.go
├── user_query.go
└── user_update.go

3、有表描述后,我们就要实例化到数据中,建立一个main包,中间创建一个main.go文件,手动执行后即可在mysql中创建一个User表

package mainimport ("fmt""go_ent_stu/dao" // 这个是我们新建一个dao目录,用来存对mysql所有操作的方法"go_ent_stu/internal/ent"_ "github.com/go-sql-driver/mysql"
)func initMysql() {username := "root"password := "root"address := "127.0.0.1:3306"dbname := "test"dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true", username, password, address, dbname)var err error// dao.Db:用于存放连接mysql后的client,在dao中做为全局存储,dao/client.go文件dao.Db, err = ent.Open("mysql", dsn)if err != nil {fmt.Println("ent Open is err ", err)}
}// 建User表,创建了实体
func main() {initMysql()
}

4、创建编写目录与文件,dao/client.go 存放全局都要用到连接mysql的client

package daoimport "go_ent_stu/internal/ent"var (Db *ent.Client
)

5、在dao目录下新建user/func_to_user.go文件,存放对mysql的操作

package userimport ("context""fmt""go_ent_stu/dao""go_ent_stu/internal/ent""go_ent_stu/internal/ent/user"
)// 增
func Insert() {client := dao.Dbu, err := client.User.Create().SetAge(19).SetName("helloman").Save(context.Background())if err != nil {fmt.Println("client.User.Create err is ", err)}fmt.Println("U is ", u)
}// 查
func Select() (*ent.User, error) {client := dao.Dbu, err := client.User.Query().Where(user.NameEQ("helloman")).Only(context.Background())
// 有条件查的例子, 查询 年龄>=18 and 年龄<=30 的所有数据
// client.User.Query().Where(user.AgeGTE(18), user.AgeLTE(30)).All(context.Background())if err != nil {fmt.Println("client.User.Query err is ", err)}fmt.Println("查询成功")return u, nil
}// 改
func Update(test_user *ent.User) {u, err := test_user.Update().SetAge(1000).Save(context.Background())if err != nil {fmt.Println("test_user.Update err is ", err)}fmt.Println("修改成功")fmt.Println("update u is ", u)
}// 删
func Delete(test_user *ent.User) {client := dao.Dberr := client.User.DeleteOne(test_user).Exec(context.Background())if err != nil {fmt.Println("client.User.DeleteOne err is ", err)}fmt.Println("删除成功")
}

6、建好这些方法后,就可以通过main包下的main.go进行调用,实验

package mainimport ("fmt""go_ent_stu/dao""go_ent_stu/dao/user""go_ent_stu/internal/ent"_ "github.com/go-sql-driver/mysql"
)func initMysql() {username := "root"password := "root"address := "127.0.0.1:3306"dbname := "test"dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?parseTime=true", username, password, address, dbname)var err errordao.Db, err = ent.Open("mysql", dsn)if err != nil {fmt.Println("ent Open is err ", err)}
}// 建User表,创建了实体
func main() {initMysql()// 增user.Insert()// 查u, _ := user.Select()// 改user.Update(u)// 删user.Delete(u)
}

这些就解决了,对mysql的基本操作,但是对一些特殊需求这些知识量还不够,因此进行查询官方文档查看对应的api(可能需要梯子):https://entgo.io/

go ent框架使用相关推荐

  1. 2017年Android第三方框架排行榜

    2017年Android百大第三方框架排行榜 查看全文 http://www.taodudu.cc/news/show-4614408.html 相关文章: Android好用的第三方组件 持续更新 ...

  2. VSCode:当匹配到结果时,如何一次性全部选中操作(复制 删除)?

    最近需要处理几十万行的文字,然后提取出数千行(嗯,我在做输入法词库).在 VSCode 里我用正则匹配到了想要的结果后,如何能够快速把这些行提取出来呢? 其实非常简单,Alt + Enter 即可选中 ...

  3. go语言ORM框架ent使用教程

    ent是什么 ent是一个简单而又功能强大的Go语言实体框架,ent易于构建和维护应用程序与大数据模型. 简而言之,ent是一款便于操作的orm框架 installation go get entgo ...

  4. Linux内核跟踪之trace框架分析【转】

    转自:http://blog.chinaunix.net/uid-20543183-id-1930846.html ------------------------------------------ ...

  5. 驱动硬件Framebuffer驱动程序框架 skeletonfb.c 分析

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 Framebuffer驱动程序框架 skeletonfb.c 析分 近来想好好研究一下lcd驱动发开程过,lcd驱动发开重要就是fr ...

  6. Kali Linux 渗透测试之被动信息收集(三)——Recon-NG框架

    Recon-NG框架 (1)Recon-NG框架简介 Recon-NG是由python编写的一个开源的Web侦查(信息收集)框架,命令格式与msf一致: Recon-NG框架是一个全特性的工具,使用它 ...

  7. Python 无框架实现决策树(DecisionTree)

    决策树是一类常见的机器学习方法,我们可以通过对样本的属性进行一系列判断,最终决策其所属的标签类别,也就是说决策树是一类分类算法. 以西瓜书第4章决策树所给数据为例,构建决策树的过程大致为,我们每次通过 ...

  8. 第22关 go的web框架-gin

    怕什么真理无穷,进一寸有一寸的欢喜. 第22关 go的web框架-gin 22-1 gin的helloworld体验 22-2 使用New和Default初始化路由器的区别 22-3 gin的路由分组 ...

  9. 【kratos】kratos 框架使用新的,还是非常好的技术框架,还要继续学习,掌握了proto 文件的使用、wire的使用就方便了。

    1,使用的kratos 版本是:v2.2.1 使用项目创建一个带web端和 grpc 服务的. 使用 wire 进行依赖注入. kratos 的官方网站是: https://go-kratos.dev ...

最新文章

  1. CV_IMAGE_ELEM参数赋值时注意的问题
  2. Linux编程 20 shell编程(shell脚本创建,echo显示信息)
  3. 属性与意图识别_解密宝能汽车智能驾舱的“未来属性”
  4. Graphpad Prism作相关性分析图
  5. Linkis生产部署服务器配置参考指南
  6. c语言文本按行分配数组元素,【转】C语言中动态分配数组
  7. 请求网页时,怎么给我返回了一段 JavaScript 代码
  8. nodejs基础整理
  9. Ubunt sudo免密码输入
  10. OpenCV_信用卡识别代码_唐宇迪实战项目
  11. html js把json转化为excel,json转换Excel
  12. 【对讲机的那点事】带你玩转宝锋UV6R对讲机(四)
  13. Windows无法解压文件-potentially harmful
  14. DM数据库安装、踩雷、解决办法
  15. Ubuntu下硬件信息的查看方式
  16. 【Pytorch】torch.bmm()方法使用
  17. 算法工程师(机器学习/深度学习)Offer的准备流程
  18. 修改tomcat的默认首页
  19. 计算机中丢失dinput8,dinput8.dll_丢失dinput8.dll修复
  20. Flask中的session伪造

热门文章

  1. 《Python cookbook》 “定义一个属性可由用户修改的装饰器” 笔记
  2. 样本服从正态分布,证明样本容量n乘样本方差与总体方差之比服从卡方分布x^2(n)...
  3. EAUML日拱一卒-微信小程序实战:位置闹铃 (16)-单元测试是个技术活
  4. 快速傅里叶变换(FFT)的推导过程(DIT)
  5. 甲骨文诉谷歌Java API版权纠纷可能移至美国最高法院
  6. 小觅双目相机如何使用_小觅双目摄像头标准版(S版)常见问题
  7. 稳定性高可用测试——各大厂质量保障实践分享汇总(下)
  8. 博通Broadcom SDK源码学习与开发10——Cable Modem IPv6地址
  9. [人物]一个预言家的命运:忽悠了马云的“骗子”,风口上的先知
  10. [转]应该怎么读Linux?