当前位置: 首页 > news >正文

【go】ent操作之CRUD与联表查询

文章目录

  • 1 CRUD
    • 1.1 创建
      • 1.1.1 单条创建
      • 1.1.2 批量创建
    • 1.2 查找
      • 1.2.1 查询单条 / 条件准确查询
      • 1.2.2 查询单条 / 条件模糊查询
      • 1.2.3 查询单条 / In
      • 1.2.4 查询全部
    • 1.3 更新
    • 1.4 删除
  • 2 联表查询
    • 2.1 O2M(一对多查询)
      • 2.1.1 增加Edge
      • 2.1.2 查询方法
        • 2.1.2.1 查询函数`QueryOrder()`与`WithOrder()`
        • 2.1.2.2 聚合函数 `Aggregate`求`max` \ `min` \ `avg`
        • 2.1.2.3 聚合函数 `Aggregate`根据用户身份做分类统计
  • 3 Reference

1 CRUD

1.1 创建

1.1.1 单条创建

ctx := context.Background()
user,err := db.User.Create().SetClass(classObj).SetName("小红").SetSex(false).SetAge(12).Save(ctx)// SaveX()不会返回error类型
user:= db.User.Create().SetClass(classObj).SetName("小红").SetSex(false).SetAge(12).SaveX(ctx)

1.1.2 批量创建

type studentData struct {Name stringAge  intSex  bool
}data := make([]studentData, 3)data[0].Name = "小明"
data[1].Name = "小刚"
data[2].Name = "小李"data[0].Age = 12
data[1].Age = 13
data[2].Age = 11data[0].Sex = true
data[1].Sex = true
data[2].Sex = falsebulk := make([]*ent.User, len(data))
for i, d := range data{bulk[i] := db.User.Create().SetName(d.Name).SetSex(d.Sex).SetAge(d.Age)
}users, err := db.User.CreateBulk(bulk...).Save(ctx)

Create()的对象不立马保存,而是储存在切片中,之后再统一使用CreateBulk()的方法来批量创建数据

1.2 查找

1.2.1 查询单条 / 条件准确查询

user, err := db.User.Query().Where(user.Age(12)).First(ctx)

1.2.2 查询单条 / 条件模糊查询

user, err := db.User.Query().Where(user.NameContains('明')).First(ctx)

1.2.3 查询单条 / In

names := []string{"amy","mike"}
user, err := db.User.Query().Where(user.NameIn(names...)).First(ctx)

1.2.4 查询全部

users, err := db.User.Query().Where(user.Age(12)).All(ctx)

1.3 更新

err := db.User.Update().SetName("一班").SetLevel(2).Exec(ctx)

1.4 删除

user, err := db.User.Delete().Where(user.Name("小红")).Exec(ctx)

2 联表查询

2.1 O2M(一对多查询)

2.1.1 增加Edge

UserOrder举例,一个用户可以有多个订单的场景下的模型定义

// spec/schema/user.go
package schemaimport ("entgo.io/ent""entgo.io/ent/dialect/entsql""entgo.io/ent/schema/edge""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.String("id").MaxLen(50).Comment("id"),field.String("name").MaxLen(50).Comment("名称"),}
}// Edges of the User.
func (User) Edges() []ent.Edge {return []ent.Edge{edge.To("orders", Order.Type),}
}
// spec/schema/order.go
package schemaimport ("entgo.io/ent""entgo.io/ent/dialect/entsql""entgo.io/ent/schema/edge""entgo.io/ent/schema/field"
)// Order holds the schema definition for the Order entity.
type Order struct {ent.Schema
}// Fields of the Order.
func (Order) Fields() []ent.Field {return []ent.Field{...field.String("product").MaxLen(50).Comment("产品"),field.Int("user_id").Comment("用户ID"),}
}// Edges of the Order.
func (Order) Edges() []ent.Edge {return []ent.Edge{edge.From("user", User.Type).Ref("orders").Unique().Field("user_id").Required(),}
}

2.1.2 查询方法

2.1.2.1 查询函数QueryOrder()WithOrder()
ctx := context.Background()// 查询user下的所有orders
userID := 1
orders, _ := db.User.Query().Where(user.ID(userID)).QueryOrder().All(ctx)// 查询user,同时获取到user下的orders列表
user, _ := db.User.Query().Where(user.ID(userID)).WithOrder().Only(ctx)
orders := user.Edges.Orders// 查询user,同时获取到user下符合条件的orders列表
user, _ := db.User.Query().Where(user.ID(userID)).WithOrder().Where(order.Product("xxx")).Only(ctx)
orders := user.Edges.Orders// 查询order对应的user
orderID := 1
user, _ := db.Order.Query().Where(order.ID(orderID)).QueryUser().Only(ctx)// 查询order,同时获取order对应的user信息
order, _ := db.Order.Query().Where(order.ID(orderID)).WithUser().Only(ctx)
user := order.Edges.User
2.1.2.2 聚合函数 Aggregatemax \ min \ avg
type UserTest struct {CompanyId string  `json:"company_id,omitempty"`Max       int     `json:"max,omitempty"`Min       int     `json:"min"`Avg       float32 `json:"avg,omitempty"`
}res := []UserTest {}
err := db.User.Query().Where(user.CompanyIDIn(companyIds...)).GroupBy(user.FieldCompanyID).Aggregate(func(s *sql.Selector) string {t := sql.Table(order.Table)s.Join(t).On(s.C(user.FieldID), t.C(order.FieldUserID))return sql.As(sql.Max(t.C(order.FieldBandwidth)), "max")},func(s *sql.Selector) string {t := sql.Table(order.Table)s.Join(t).On(s.C(user.FieldID), t.C(order.FieldUserID))return sql.As(sql.Min(t.C(order.FieldBandwidth)), "min")},func(s *sql.Selector) string {t := sql.Table(order.Table)s.Join(t).On(s.C(user.FieldID), t.C(order.FieldUserID))return sql.As(sql.Avg(t.C(order.FieldBandwidth)), "avg")},).Scan(c, &res)

输出:

[{"company_id": "123","max": 100,"min": 10,"avg": 55,},{"company_id": "456","max": 100,"min": 10,"avg": 55,}
]
2.1.2.3 聚合函数 Aggregate根据用户身份做分类统计
type UserTest struct {Count     int     `json:"count,omitempty"`Type      string  `json:"type,omitempty"`
}res := []UserTest {}
err := db.User.Query().Where(user.CompanyIDIn(companyIds...)).Aggregate(ent.Count(),func(s *sql.Selector) string {s.GroupBy(user.FieldJob)return sql.As(user.FieldJob, "type")},).Scan(c, &res)

输出:

[{"type": "teacher","count": 24},{"type": "student","count": 65,}
]

3 Reference

  1. ent官方文档:https://entgo.io/docs/getting-started

  2. go语言ORM框架ent使用教程:
    https://blog.csdn.net/a914541185/article/details/121274321

  3. 在线SQL转Schema:https://old.printlove.cn/tools/sql2ent

相关文章:

【go】ent操作之CRUD与联表查询

文章目录 1 CRUD1.1 创建1.1.1 单条创建1.1.2 批量创建 1.2 查找1.2.1 查询单条 / 条件准确查询1.2.2 查询单条 / 条件模糊查询1.2.3 查询单条 / In1.2.4 查询全部 1.3 更新1.4 删除 2 联表查询2.1 O2M(一对多查询)2.1.1 增加Edge2.1.2 查询方法2.1.2.1 …...

服务器性能监控管理方法及工具

服务器是组织数据中心的主干,无论是优化的用户体验,还是管理良好的资源,服务器都能为您完成所有工作,保持服务器随时可用和可访问对于面向业务的应用程序和服务以最佳水平运行至关重要。 理想的服务器性能需要主动监控物理和虚拟…...

AUTOSAR汽车电子嵌入式编程精讲300篇-基于FPGA和CAN协议2.0B的总线控制器研究与设计

目录 前言 研究现状分析 2 CAN总线协议 2.1 CAN总线基本概念 2.2 物理层...

14.1 Ajax与JSON应用(❤❤)

14.1 Ajax与JSON应用 1. Ajax1.1 简介1.2 Ajax使用流程1. 前端创建XMLHttpRequest对象2. 发送Ajax请求3. 处理服务器响应4. 代码2. JSON2.1 简介2.2 JS解析JSON3. Ajax与JSON开发3.1 后端:用Jackson实现JSON序列化输出3.2 前端Ajax处理JSON3.3 Ajax工具...

ffmpeg命令生成器

FFmpeg 快速入门:命令行详解、工具、教程、电子书 – 码中人的博客FFmpeg 是一个强大的命令行工具,可以用来处理音频、视频、字幕等多媒体文件。本文介绍了 FFmpeg 的基本用法、一些常用的命令行参数,以及常用的可视化工具。https://blog.mzh…...

JavaScript基础速成

由于学web时只学了后端,现在到了前后端联调的场景发现看不懂前端代码,于是开始恶补 看了下基础内容发现html和css比较好看懂,但JavaScript比较迷,大概知道组件id绑定事件 下面选取看菜鸟教程补充的JS知识 JS的作用 JS是在html…...

openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志

文章目录 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志215.1 性能日志概述215.2 性能日志收集的配置参数 openGauss学习笔记-215 openGauss性能调优-确定性能调优范围-性能日志 215.1 性能日志概述 性能日志主要关注外部资源的访问性能问题。 性能日…...

在vs code的terminal,debug执行python main.py --train True

GPT4告诉我: 在VS Code中以debug状态执行带有参数(如--train)的main.py文件,你需要在launch.json配置文件中正确设置参数。以下是详细步骤: 打开你的main.py文件:确保你的main.py文件已经在VS Code中打开…...

docker 简单项目

要将服务器端口映射到容器端口,你可以使用 Docker 命令的 -p 选项。以下是基本的步骤: 1. **拉取镜像:** 在服务器上运行以下命令拉取你想要的 Docker 镜像,例如 Nginx: bash docker pull nginx 2. **运行容器…...

计算机毕业设计 基于SpringBoot的线上教育培训办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

四、机器学习基础概念介绍

四、机器学习基础概念介绍 1_机器学习基础概念机器学习分类1.1 有监督学习1.2 无监督学习 2_有监督机器学习—常见评估方法数据集的划分2.1 留出法2.2 校验验证法(重点方法)简单交叉验证K折交叉验证(单独流出测试集)(常…...

Excel设置单元格下拉框(poi)

前言 年关在即,还在最后的迭代处理,还分了个其他同事的单,说是导出的Excel模版的2列要修改为下拉选项,过程很曲折,不说,以下其实就是一个笔记而已! 其实之前分享过阿里的EasyExcel设置单…...

api接口是什么意思,api接口该如何防护呢?

API接口:应用程序与服务之间的接口 什么是API接口 API是应用程序接口的缩写,指的是能够让不同的应用程序之间交换数据的一种方式。一个API接口就是应用程序与服务之间的接口,它定义了服务提供的功能和数据,以及应用程序如何访问这…...

PMP资料怎么学?PMP备考经验分享

PMP考试前大家大多都是提前备考个一两个月,但是有些朋友喜欢“不走寻常路”,并不打算去考PMP认证,想要单纯了解PMP,不管要不要考证,即使是仅仅学习了解一下我个人都非常支持,因为专业的基础的确能提高工作效…...

partition by list(msn_id)子句的含义

在数据库查询中,特别是在使用SQL语言时,"PARTITION BY" 子句用于对结果集进行分区,以便可以对每个分区进行单独的聚合操作。这是在执行窗口函数(如 ROW_NUMBER(), RANK(), SUM(), AVG() 等)时特别有用的。 …...

【C++】I/O多路转接详解(二)

在上一篇文章【C】I/O多路转接详解(一) 在出现EPOLL之后,随之而来的是两种事件处理模式的应运而生:Reator 和 Proactor,同步IO模型常用于Reactor模式,异步IO常用于Proactor. 目录 1. 服务器编程框架简介2. IO处理1. R…...

PySpark(三)RDD持久化、共享变量、Spark内核制度,Spark Shuffle

目录 RDD持久化 RDD 的数据是过程数据 RDD 缓存 RDD CheckPoint 共享变量 广播变量 累加器 Spark 内核调度 DAG DAG 的宽窄依赖和阶段划分 内存迭代计算 Spark是怎么做内存计算的? DAG的作用?Stage阶段划分的作用? Spark为什么比MapReduce快? Spar…...

详解MYSQL中的平均值组大小

文章目录 平均值组大小了解平均值组大小MySQL什么时候会使用平均值组大小平均值组大小对于索引选取的影响平均值组大小 了解平均值组大小 总数据量 / 值组 = 平均值组大小 值组是一组具有相同键前缀值的行,及所有相等的键为一个值组。总数据量为全表数据量MySQL什么时候会使…...

【爬虫专区】批量下载PDF (无反爬)

天命:只要没反爬,一切都简单 这次爬取的是绿盟的威胁情报的PDF 先看一下结构,很明显就是一个for循环渲染 burp抓包会发现第二次接口请求 接口请求一次就能获取到了所有的数据 然后一个循环批量下载数据即可,其实没啥难度的 imp…...

PostgreSQL解决序列(自增id)自动增长冲突

背景 一般表的id主键我们都是设置为自增序列。 但是如果我们在插入一些数据的时候手动指定id,那么自增序列不会跟随我们手动设置的id增长。 就会出现下次不设置id的时候自增到我们手动指定的id导致主键冲突bug 举个例子 现在数据有 id123 现在我们手动插入数…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

python/java环境配置

环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

JVM 内存结构 详解

内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: ​ 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...