Go语言技巧 - 12.【Go实体框架】Facebook开源ent概览 - 腾讯云开发者社区-腾讯云


本站和网页 https://cloud.tencent.com/developer/article/1928403 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Go语言技巧 - 12.【Go实体框架】Facebook开源ent概览 - 腾讯云开发者社区-腾讯云腾讯云备案控制台开发者社区学习实践活动专区工具TVP文章/答案/技术大牛搜索搜索关闭写文章提问登录/注册junedayday94 篇文章Go语言技巧 - 12.【Go实体框架】Facebook开源ent概览转到我的清单专栏首页Go编程点滴Go语言技巧 - 12.【Go实体框架】Facebook开源ent概览30分享分享文章到朋友圈分享文章到 QQ分享文章到微博复制文章链接到剪贴板海报分享海报分享Go语言技巧 - 12.【Go实体框架】Facebook开源ent概览发布于2022-01-04 13:03:54阅读 6710go-tipEnt概览Simple, yet powerful ORM for modeling and querying data.Ent作为一款由Facebook开源的库,官方定义为An entity framework for Go。从整个微服务框架来看,它更准确的定位应是 数据模型层的工具库。了解Ent这款企业级工具的大致实现,不仅有助于我们在技术选型时拓宽视野,也能帮助我们能更好地认识数据模型层。三大特性Schema As CodeSimple API for modeling any database schema as Go objects.从定义来看这个特性非常棒 - Ent 可以将各种异构数据库映射到Go语言的结构体。但在实际的开发中,如果你对各类数据库有深入的理解,就会清楚地知道这个特性在对数据库特性有一定要求时,框架层面就很难满足了。Easily Traverse Any GraphRun queries, aggregations and traverse any graph structure easily.强调对图结构的 查询、聚合和遍历。这里的图数据库和传统的关系型数据库差别不小,有兴趣的朋友可搜索图数据库的相关概念。Statically Typed And Explicit API100% statically typed and explicit API using code generation.利用代码生成的能力,保证静态类型和显示声明的API。特性总结三大特性,分别从 支持的数据库能力集、针对图形数据处理能力 和 代码生成的输出形式,描述了Ent框架的优点。这里,我会更聚焦于第二点中的关键词:图形数据。让我们带着对三个特性的初印象,开始了解相关官方示例。Ent实践Ent工具的使用方式并不是本篇的重点,具体的操作方法我会放在链接里,文中只给出关键性的内容1.创建实体链接 - https://entgo.io/docs/getting-started/#create-your-first-entityu, err := client.User.
Create().
SetAge(30).
SetName("a8m").
Save(ctx)
复制代码和GORM非常类似,但不支持复杂结构体的传入,面对大量参数时比较麻烦。2.查询实体链接 - https://entgo.io/docs/getting-started/#query-your-entitiesu, err := client.User.
Query().
Where(user.Name("a8m")).
// `Only` fails if no user found,
// or more than 1 user returned.
Only(ctx)
复制基本同上,表达方式还是很明确的。但对于Only这种新引入的关键词,对新人来说有学习成本。3.Edge相关https://entgo.io/docs/getting-started/#add-your-first-edge-relationhttps://entgo.io/docs/getting-started/#add-your-first-inverse-edge-backrefhttps://entgo.io/docs/getting-started/#create-your-second-edge我们以一个复杂Edge为例:cars, err := client.Group.
Query().
Where(group.Name("GitHub")). // (Group(Name=GitHub),)
QueryUsers(). // (User(Name=Ariel, Age=30),)
QueryCars(). // (Car(Model=Tesla, RegisteredAt=<Time>), Car(Model=Mazda, RegisteredAt=<Time>),)
All(ctx)
复制从表达式上来看,就是查询Group、然后关联查询User、最后再查到Car。首先,我们要认识到 - 抛开背后的实现,这种表达方式很简洁。如果底层是MySQL,这里至少关联了三张实体表(JOIN),很容易引起性能问题。这个问题也就是上面所说的,框架屏蔽了异构数据库而导致的。参考资料Github - https://github.com/ent/ent官网 - https://entgo.io/思考通过相关资料和简单实操,我对于Ent框架的定位是 - 一个面向图数据库的ORM框架。相信随着图数据库的逐渐成熟,Ent会更具价值。但考虑到以下两点:图数据库的成熟周期还需要一段时间,当前的维护成本高;在非图数据库上使用Ent,对开发者的要求很高,既要了解Ent对不同数据库的底层实现,又要懂数据库原理。举个例子,ent的部分Edge特性需要依赖数据库的外键,但如今主流数据库的实践,倡导去外键,而是将相关逻辑转移到程序代码里。所以,我不建议将Ent引入到项目中。关于Ent更多的细节需要大家自行阅读和实践。这里,我抛出一个自己的理解:从编程语言框架层面,不应过度基础设施的复杂度。从异构数据库来说,它们的特性、维护方式、设计模式都各不相同,应寻找每种数据库对应的工具库,而不应期望毕其功于一役。换一句话,如果期望一个工具库能适配十种数据库,那么换一种角度,这十种数据库更应该被封装成一种数据库。通用性如果能沉淀在基础设施上,价值远大于在工具库上做适配。小结Ent能在Facebook等公司与Kratos框架上沉淀,证明了它具备实际工程落地的能力,但对使用者的要求很高,很难具备普适性。前文为了表达个人想法,我在论述观点时会相对态度鲜明,但并非对Ent持有否定态度。相反地,从具体的实现细节来看,Ent给了我不少启发,尤其是强调静态类型,能看出它对性能的追求。Github: https://github.com/Junedayday/code_reading
Blog: http://junes.tech/
Bilibili: https://space.bilibili.com/293775192文章分享自微信公众号:Go编程点滴复制公众号名称本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!作者:Junedayday原始发表时间:2022-01-01如有侵权,请联系 cloudcommunity@tencent.com 删除。展开阅读全文SQLhttps网络安全数据库API举报点赞 3分享登录 后参与评论0 条评论相关文章Go语言技巧 - 14.【浅析微服务框架】go-zero概览go-zero是当前处于CNCF孵化中的一个Goz语言框架项目,在Github上的star数目前达到14.3K。junedaydayGo语言技巧 - 13.【浅析微服务框架】Go-Kit概览截止到本文发布时,Go-Kit在github上的star数为22.2k,超过了我们已经一起看过的Go-Micro与Kratos。junedaydayGo语言技巧 - 8.【浅析微服务框架】Go-Micro概览截止到本文发布时,Go-Micro在github上的star数达到了10.8k,也已经累计发布了v1、v2、v3这三个大版本,目前前两个已经停止维护。junedaydayGo语言技巧 - 9.【浅析微服务框架】Kratos概览截止到本文发布时,Kratos在github上的star数达到了15.9k。其中,在2021年7月,也正式推出了v2这个大版本。junedaydayGitHub 热点速览 Vol.35:Let's Go,Rust 大放异彩以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准:新发布 | 实用...HelloGitHubFacebook 开源 Golang 实体框架 Ent 现已支持 TiDB对于后端开发者来说,一款好用的框架能够大大提升应用的开发效率。为了降低开发者使用 TiDB 的门槛,方便开发者快速连接到 TiDB,我们也在和合作伙伴一起,逐步...PingCAP【AI+机器学习半年志】2016上半年大事记(国际篇)【新智元导读】夏至已至,2016过了一半,人工智能领域在2016上半年发生了什么大事?还记得AlphaGo吗?科技博客网站Turing Machine从硬件、技...新智元Go Web开发框架基本组成本文目的实现在Go语言开发,搭建基本的框架信息和较优秀的组件使用介绍给大家。从而可以快速上手Go语言开发工作。刘銮奕为什么一定要学Go语言?Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。机智的程序员小熊两本开源书籍,助你快速入门 Go 语言开发!首先是《Go 语言高级编程》这本书籍,里面涵盖了 CGO、Go 汇编语言、RPC 实现、Web 框架实现、分布式系统等高阶主题,适合对 Go 语言有一定经验,并...GitHubDailyGo语言学习路线 - 0.总览目前网上已有很多Go相关的教程,包括基础讲解、源码解析、面试技巧等,但我依然下决心来做一个具有强烈个人主观观点色彩的Go语言学习路线:这个系列的目标只有一个 -...junedayday2016年你应该学习的语言和框架2015年,软件开发界发生了很多变化。有很多流行的新语言发布了,也有很多重要的框架和工具发布了新版本。下面有一个我们觉得最重要的简短清单,同时也有我们觉得值得你...顶级程序员资源 | DeepPavlov:一个训练对话系统和聊天机器人的开源库选自GitHub
机器之心编译
参与:思源、刘晓坤
本文介绍了一个构建端到端对话系统和训练聊天机器人的开源项目 DeepPavlov,该开源库的构建基于 Ten...机器之心《HelloGitHub》第 41 期这是一个面向编程新手、热爱编程、对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编程语言的项目、让生活变得更美好的工具、书籍、学习笔记、教程等,这些开源项目大...HelloGitHub2022年全栈开发者需要熟悉了解的知识列表? 如果你对全栈开发不太熟悉,或者对大家在谈论全栈开发时使用的一些词感到疑惑,那么可以看看本篇文章。在这里我将解释与全栈开发内容相关的最常见词和短语。当然,了解...海拥Go语言能够取代Java,成为下一个王者吗?近几年来,Go语言真是越来越火了。我也做过几个Go语言的项目了,我们公司很多微服务的项目也在由Java往Go上面转了。我们来看看Tiobe世界编程语言排行的最新...三哥Go语言学习 - RPC篇:gRPC-Gateway示例代码概览gRPC-Gateway是gRPC生态的一环,用于对HTTP协议的扩展,是一套高性能、高扩展的开源RPC框架。junedayday为什么很多公司都转型go语言开发?Go语言能做什么选择Go语言的原因可能会有很多,关于Go语言的特性、优势等,我们在之前的文档中也已经介绍了很多了。但是最主要的原因,应该是基于以下两方面的考虑:李海彬适合 Go 新手学习的开源项目——在 GitHub 学编程故事要从 2007 年说起。因为受够了 C++ 煎熬的 Google 首席软件工程师 Rob Pike 召集 Robert Griesemer 和 Ken Th...HelloGitHub更多文章作者介绍junedayday关注专栏文章94阅读量33.6K获赞264作者排名1713精选专题腾讯云原生专题云原生技术干货,业务实践落地。活动推荐腾讯云自媒体分享计划入驻社区,可分享总价值百万资源包立即入驻邀请好友加入自媒体分享计划邀请好友,同享奖励 30 / 100 / 180 元云服务器代金券立即邀请运营活动广告关闭目录Ent概览三大特性Schema As CodeEasily Traverse Any GraphStatically Typed And Explicit API特性总结Ent实践1.创建实体2.查询实体3.Edge相关参考资料思考小结社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于视频介绍社区规范免责声明联系我们友情链接归档问题归档专栏文章归档快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列 网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN 加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2022 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 京公网安备 11010802017518 粤B2-20090059-1扫描二维码扫码关注腾讯云开发者领取腾讯云代金券