Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go每日一库之135:Ent(Facebook 开源 Golang 实体框架)

Go每日一库之135:Ent(Facebook 开源 Golang 实体框架)

作者头像
luckpunk
发布于 2023-09-30 00:48:20
发布于 2023-09-30 00:48:20
84700
代码可运行
举报
运行总次数:0
代码可运行

对于后端开发者来说,一款好用的框架能够大大提升应用的开发效率。为了降低开发者使用 TiDB 的门槛,方便开发者快速连接到 TiDB,我们也在和合作伙伴一起,逐步完善面向主流开发语言和框架的连接支持

近日,Facebook 开源的 Golang 实体框架 Ent 完成了对 TiDB 数据库的支持。 Ent 是一款易于构建和维护应用程序与大数据模型的框架。具有以下特点:

  • Schema 即代码:能将任何数据库表建模为 Go 对象;
  • 轻松地遍历任何图形 :可以轻松地运行查询、聚合和遍历任何图形结构;
  • 静态类型和显式 API:使用代码生成静态类型和显式 API,查询数据更加便捷;
  • 多存储驱动程序:支持 MySQLPostgreSQLSQLite、Gremlin,现在也已经支持了 TiDB;
  • 可扩展:易于扩展和使用 Go 模板自定义。

下面通过一个 Hello World 的应用示例,来看下如何快速实现一个基于 Ent + TiDB 的应用。

Hello World 应用示例

1.用 Docker 在本地启动一个 TiDB Server

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -p 4000:4000 pingcap/tidb

现在你应该有一个运行的 TiDB 实例,开放了 4000 端口监听。

2.在本地拷贝 hello world 的示例 repo和安装ent

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/hedwigz/tidb-hello-world.git

go get https://github.com/ent/ent

在这个示例 repo 中我们定义了一个简单的 User schema

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func (User) Fields() []ent.Field {
           return []ent.Field{
                  field.Time("created_at").
                          Default(time.Now),
                  field.String("name"),
                  field.Int("age"),
          }
 }

然后,连接 Ent 和 TiDB:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client, err := ent.Open("mysql", "root@tcp(localhost:4000)/test?parseTime=true")
if err != nil {
        log.Fatalf("failed opening connection to TiDB: %v", err)
}
defer client.Close()
// Run the auto migration tool, with Atlas.
if err := client.Schema.Create(context.Background(), schema.WithAtlas(true)); err != nil {
        log.Fatalf("failed printing schema changes: %v", err)
}

可以看到,在第一行我们通过一个 MySQL 语句去连接 TiDB Server,因为 TiDB 是兼容 MySQL 的,所以不需要其他特殊的 driver。 话虽如此,TiDB 和 MySQL 还是有很多不同,尤其是与 Schema 迁移相关的操作,比如 SQL 诊断和迁移规划。所以,Atlas 可以自动监测出是连接到 TiDB,做相应的迁移处理。 此外,第七行我们使用schema.WithAtlas(true),表示 Ent 是使用“Atlas”作为迁移引擎。Atlas 是 Ent 刚刚发布的迁移引擎,得益于 Atlas 的最新设计,对新数据库的支持也变得前所未有的简单。

最后,我们新建一条 user 数据,并保存到 TiDB 中,以用于后需的数据读取和输出。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client.User.Create().
               SetAge(30).
               SetName("hedwigz").
               SaveX(context.Background())
user := client.User.Query().FirstX(context.Background())
fmt.Printf("the user: %s is %d years old\n", user.Name, user.Age)

3.运行这个示例程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ go run main.go
the user: hedwigz is 30 years old

在这次快速演练中,我们成功实现了:

  • 启动一个本地的 TiDB 实例;
  • 连接 Ent 和 TiDB 数据库;
  • 使用 Atlas 迁移 Ent Schema;
  • 使用 Ent 从 TiDB 中插入和读取数据。

版本说明

目前,这个示例应用在 Ent v0.10 和 TiDB v5.4.0 中可以正常运行,Ent 也计划在未来继续拓展对 TiDB 的支持。如果你使用其他版本的 TiDB 或者需要帮助,欢迎加入 asktug.com 来交流。如果你也有项目希望与 TiDB 适配,欢迎来 GitHub 提交 issue 。 除了 Ent,TiDB 此前已经添加了对 GORM 和 go-sql-driver/mysql 的支持,详情可查看文档: https://docs.pingcap.com/appdev/dev

参考

https://github.com/ent/ent/blob/master/README_zh.md https://entgo.io/zh/docs/getting-started/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Facebook 开源 Golang 实体框架 Ent 现已支持 TiDB
对于后端开发者来说,一款好用的框架能够大大提升应用的开发效率。为了降低开发者使用 TiDB 的门槛,方便开发者快速连接到 TiDB,我们也在和合作伙伴一起,逐步完善面向主流开发语言和框架的连接支持。
PingCAP
2022/03/25
9210
每日一库:ent简介
ent 是一个由 Facebook 开发的 Go 语言的实体框架,用于构建和维护数据模型。它提供了一种简单的方式来定义、交互和查询数据。
孟斯特
2023/10/16
6620
每日一库:ent简介
ent orm笔记1---快速尝鲜
前几天看到消息Facebook孵化的ORM ent转为正式项目,出去好奇,简单体验了一下,使用上自己感觉比GORM好用,于是打算把官方的文档进行整理,也算是学习一下如何使用。
coders
2020/08/28
2.2K0
ent orm笔记4---Code Generation
在前面几篇文章中,我们经常使用的可能就是entc这个命令了,entc这个工具给带来了很多功能,这篇文章主要整理关于ent orm 中Code Generation
coders
2020/09/03
7220
ent orm笔记4---Code Generation
使用Ent、Atlas和pgvector在Go中构建RAG系统
在这篇博文中,我们将探讨如何使用 Ent, Atlas, 和 pgvector 构建一个 RAG (检索增强生成) 系统。
云云众生s
2025/02/18
2640
ent使用体验
ent:https://github.com/facebookincubator/ent是facebook 开源的golang orm 框架,schema 即代码、方便的图遍历、静态类型以及显示api、多种存储引擎支持(当前是mysql,sqlite,以及Gremlin)等。
golangLeetcode
2023/09/06
4920
ent使用体验
schema即服务:ent生成proto和grpc服务
在尝试使用ent的基本功能后ent使用体验,我们尝试使用ent来生成grpc服务:
golangLeetcode
2023/09/06
5270
schema即服务:ent生成proto和grpc服务
Go语言技巧 - 12.【Go实体框架】Facebook开源ent概览
Simple, yet powerful ORM for modeling and querying data.
junedayday
2022/01/04
1.8K0
Go语言技巧 - 12.【Go实体框架】Facebook开源ent概览
ent orm笔记2---schema使用(上)
在上一篇关于快速使用ent orm的笔记中,我们再最开始使用entc init User 创建schema,在ent orm 中的schema 其实就是数据库模型,在schema中我们可以通过Fields 定义数据库中表的字段信息;通过Edges 定义表之间的关系信息;通过Index 定义字段的索引信息等等,这篇文章会整理一下关于ent orm 中如何使用这些。
coders
2020/08/28
1.3K0
ent orm笔记2---schema使用(上)
golang源码分析:grpc 链接池(1)
上面几个问题,看着都觉得这么简单还用问?但是仔细一想,内心还是有些不太确定。因为没有分析过源码!下面我们带着问题来进行研究。我们生成一段代码,启动一个server
golangLeetcode
2023/03/01
1.1K0
golang源码分析:grpc 链接池(1)
如何找到Redis大Key?
有时候,可能因为业务设计不合理,或者其他的一些原因,导致Redis某个key非常大。
数据库交流
2023/11/08
7430
如何找到Redis大Key?
Go 每日一库之 rpcx
在之前的两篇文章rpc和json-rpc中,我们介绍了 Go 标准库提供的rpc实现。在实际开发中,rpc库的功能还是有所欠缺。今天我们介绍一个非常优秀的 Go RPC 库——rpcx。rpcx是一位国人大牛开发的,详细开发历程可以在rpcx官方博客了解。rpcx拥有媲美,甚至某种程度上超越gRPC的性能,有完善的中文文档,提供服务发现和治理的插件。
用户7731323
2020/09/08
9540
Go 每日一库之 twirp
简介 twirp是一个基于 Google Protobuf 的 RPC 框架。twirp通过在.proto文件中定义服务,然后自动生产服务器和客户端的代码。让我们可以将更多的精力放在业务逻辑上。咦?这不就是 gRPC 吗?不同的是,gRPC 自己实现了一套 HTTP 服务器和网络传输层,twirp 使用标准库net/http。另外 gRPC 只支持 HTTP/2 协议,twirp 还可以运行在 HTTP 1.1 之上。同时 twirp 还可以使用 JSON 格式交互。当然并不是说 twirp 比 gRPC
用户7731323
2020/09/08
9810
搞懂gRPC支持HTTP进行双协议通信
2)通过 Protocol Buffers 提供强类型接口定义和高效的二进制序列化,减少数据体积;
闫同学
2025/04/18
3430
搞懂gRPC支持HTTP进行双协议通信
【Golang】快速复习指南QuickReview(十一)——数据库访问(MySql为例)
俗话说卖钱不卖钱,摊摊儿要扯圆,甭管怎样,我们先建立一个标准的golang项目,来访问数据库。
DDGarfield
2022/06/23
7320
Go MCP 常用库
两个库及其基本用法。两者都实现了 MCP 协议相关功能,使用方式略有不同,可根据个人偏好选择其中之一。
陈明勇
2025/04/06
4592
Go MCP 常用库
go grpc 初步笔记
像许多RPC系统一样,gRPC基于定义服务的思想,指定可以使用其参数和返回类型远程调用的方法。
solate
2019/07/22
6680
grpc-go之基本使用(一)
gRPC 是一个高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。
Johns
2022/09/26
1.5K0
golang集成测试:dockertest testcontainers-go
在做集成测试的时候,每次测试前,如果通过docker重启一个干净的容器是不是免去了数据清理的苦恼。https://github.com/testcontainers/testcontainers-go和https://github.com/ory/dockertest可以解决我们的苦恼,它们很相似都是调用docker的api实现镜像的拉取和容器的启动关闭。然后我们可以基于容器做对应的集成测试。
golangLeetcode
2023/03/01
8400
golang集成测试:dockertest testcontainers-go
实践gRPC之GoLang入门HelloWord
这篇文章里我们要实现一个基于GoLang编程语言的gRPC的客户端与服务端通信的HelloWorld案例 编写hello_world.proto文件,如下代码: syntax proto3 package proto //接口请求入参 message HelloRequest{ string request = 1; } //接口返回出参 message HelloResponse{ string response = 1; } //定义接口 service HelloService{
阿伟
2019/08/26
6830
实践gRPC之GoLang入门HelloWord
相关推荐
Facebook 开源 Golang 实体框架 Ent 现已支持 TiDB
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档