facebook开源golang实体框架ent

GoCN GoCN     2022-11-29     122

关键词:

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


近日,Facebook 开源的 Golang 实体框架 Ent 完成了对 TiDB 数据库的支持。
Ent 是一款易于构建和维护应用程序与大数据模型的框架。具有以下特点:
· Schema 即代码:能将任何数据库表建模为 Go 对象;
· 轻松地遍历任何图形 :可以轻松地运行查询、聚合和遍历任何图形结构;
· 静态类型和显式 API:使用代码生成静态类型和显式 API,查询数据更加便捷;
· 多存储驱动程序:支持 MySQL、PostgreSQL、SQLite、Gremlin,现在也已经支持了 TiDB
· 可扩展:易于扩展和使用 Go 模板自定义。

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

Hello World 应用示例

1. 用 Docker 在本地启动一个 TiDB Server
docker run -p 4000:4000 pingcap/tidb
现在你应该有一个运行的 TiDB 实例,开放了 4000 端口监听。

2. 在本地拷贝 hello world 的示例 repo
git clone https://github.com/hedwigz/tidb-hello-world.git

在这个示例 repo 中我们定义了一个简单的 User schema
go title="ent/schema/user.go"
 func (User) Fields() []ent.Field 
           return []ent.Field
                  field.Time("created_at").
                          Default(time.Now),
                  field.String("name"),
                  field.Int("age"),
          
 

然后,连接 Ent 和 TiDB:
go title="main.go"
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 中,以用于后需的数据读取和输出。
go title="main.go"
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. 运行这个示例程序:
$ 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

pythia:facebook最新开源的视觉语言多任务学习框架

Facebook发布了一个全新的多任务学习框架Pythia,它基于PyTorch且可用于视觉和语言的联合任务。Pythia是一种模块化的即插即用框架,数据科学家和机器学习开发者能快速构建、复现和构建基准模型。项目地址:https://github.com/facebook... 查看详情

用于创建 gmail/google group/facebook 类型的界面(和一些功能)的开源框架

】用于创建gmail/googlegroup/facebook类型的界面(和一些功能)的开源框架【英文标题】:Opensourceframeworktocreategmail/googlegroup/facebookkindofinterface(andsomefunctionalities)【发布时间】:2013-01-1405:49:23【问题描述】:我正在开始一个新的开源... 查看详情

调试实体框架 SQL 语句

】调试实体框架SQL语句【英文标题】:DebuggingEntityFrameworkSQLstatements【发布时间】:2011-12-1515:40:59【问题描述】:在使用实体框架进行SQL通信时,我的响应时间很奇怪。这是来自我的虚拟主机:这是来自我的本地服务器:我担心... 查看详情

开源实体映射框架emitmapper介绍

概述对象—对象映射的一种传统做法就是创建许多数据转换对象。这些对象负责在众多数据对象之间复制数据。对于拥有大量数据对象的程序而言,开发人员需要花费大量的时间精力编写大量的数据转换对象来支持数据对象... 查看详情

实体框架用户和角色管理

】实体框架用户和角色管理【英文标题】:EntityFrameworkUserandRoleManagement[closed]【发布时间】:2015-11-0204:39:45【问题描述】:我有一个包含多个项目的VisualStudio解决方案:域类数据访问层-包含数据库上下文MVC应用程序。默认情况下... 查看详情

10个优秀的golang开源库类,武装生产力(代码片段)

一、Http框架Gin推荐指数:⭐⭐⭐⭐⭐GitHub地址:https://github.com/gin-gonic/ginGin是一个用Go(Golang)编写得HTTPweb框架,拥有更好性能得API框架,文档非常完全,很多微服务也很方便集成。Gin绝对优秀~touchexam... 查看详情

golang网络框架netpoll(multi-reactor模型)核心源码分析(代码片段)

...工程开发中绝大部分的情况都会优先考虑采用已有的一些开源网络框架来做功能的开发。网络框架不同的语言有不同的实现,例如java中大名鼎鼎的netty,再比如c++中的libevent、boost::asio、muduo等,golang中目前在开源社区比较有影响... 查看详情

实体框架:如何从 L2E 返回基本类型

】实体框架:如何从L2E返回基本类型【英文标题】:EntityFramework:howtoreturnabasetypefromL2E【发布时间】:2010-09-1115:17:38【问题描述】:考虑以下架构:基础对象“实体”派生对象“Entry:Base”以及进一步派生的对象“CancelledEntry:Entry... 查看详情

使用实体框架在代码优先迁移中有条件地插入数据

】使用实体框架在代码优先迁移中有条件地插入数据【英文标题】:Conditionallyinsertingdatainacode-firstmigrationwithEntityFramework【发布时间】:2020-01-2012:19:34【问题描述】:我正在尝试使用实体框架进行第二次迁移,到目前为止我生成... 查看详情

在迁移 Up 方法中更改数据 - 实体框架

】在迁移Up方法中更改数据-实体框架【英文标题】:ChangedatainmigrationUpmethod-EntityFramework【发布时间】:2016-02-0415:26:43【问题描述】:我在现有模型中添加了一个新属性。这是一个布尔属性,默认值为true。此表中有现有数据,我... 查看详情

alibaba/ioc-golang正式开源——打造服务于go开发者的ioc框架(代码片段)

IOC(inversionofcontrol)即控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。IOC-golang是一款服务于Go语言开发者的依赖注入框架,基于控制反转思路,方便开发人员搭建任... 查看详情

golang有没有好的开源游戏框架

...简单。相信有意向深入学习Go语言的小伙伴都在研究Go的开源项目,今天我就把自己觉得不错的6个Go开源项目推荐给大家,希望大家能获得收获和成长。推荐一:kubernetes【Star:44418】Kubernetes基于Docker,其目的是让用户通过Kubernete... 查看详情

有哪些不错的golang开源项目?

目前人在字节做Go开发。寻找Golang开源项目学习目的可能是:想学习或者提高自己对Go项目的组织和编排能力;想学习Go项目的框架设计;想在一些Go语法上细节的优化和进阶。我推荐两个项目:一、tinode这是一个... 查看详情

字节跳动开源的一个golang微服务http框架

...0c;是一个Golang微服务HTTP框架,在设计之初参考了其他开源框架fasthttp、gin、echo的优势,并结合字节跳动内部的需求,使其具有高易用性、高性能、高扩展性等特点,目前在字节跳动内部已广泛使用。如今越来越多... 查看详情

facebook开源时序利器-kats(代码片段)

...和通用的框架,用于在Python中进行时序分析,由Facebook开源。TimeSeriesData是Kats中表示单变量和多变 查看详情

facebook开源时序利器-kats(代码片段)

...和通用的框架,用于在Python中进行时序分析,由Facebook开源。TimeSeriesData是Kats中表示单变量和多变 查看详情

实体框架中与代码优先外键的更改冲突

】实体框架中与代码优先外键的更改冲突【英文标题】:ConflictingchangeswithcodefirstforeignkeyinEntityFramework【发布时间】:2012-06-1122:59:23【问题描述】:我使用适配器能够将接口而不是具体类型插入dbcontext。适配器独立工作,但我无... 查看详情

golang学习之grpc+protobuf(代码片段)

...的rpc调用框架如dubbo、ZerocIce、thrift等。thrift是为了解决facebook系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性。所以thrift可以支持多种程序语言;通过ZerocIce企业可以轻松构建SOA;Avro是Ha... 查看详情