跳到主要内容

欢迎使用 ent

· 阅读时间 4 分钟

特拉维夫Facebook Connectivity团队 Go 使用现状

20个月前,在经历了约5年左右的 Go 开发经历和部分公司实践后,我加入了特拉维夫的 Facebook Connectivity 团队(FBC),
我加入了一个正在从事一个新项目的团队,我们需要为这个任务选择一种语言。 我们比较了几种语言,最终决定使用 Go 语言。

从那时起,Go 继续推广到其他 FBC 项目,并在特拉维夫仅有15名 Go 工程师的情况下取得了巨大成功。 新服务现在使用 Go 编写

为 Go 编写新的 ORM 的动机

我在Facebook的5年工作时间主要方向是基础设施工具和微服务相关,并没有太多的数据模型工作。 有一个服务需要与SQL数据库进行交互,使用着一个开源的解决方案;但是这个项目有复杂的数据模型,并且使用了另一种语言和健壮的 ORM。 比如,Python 与 SQLAlchemy。

在Facebook,我们喜欢用图的概念来思考我们的数据模型。 我们在内部使用这个模型有很好的经验。
Go 没有适当的基于图的ORM ,于是我们决定以下原则编写一个:

  • Schema即代码 - 定义类型, 关联和约束应该在 Go 代码(而不是结构标签),并且应该使用 CLI 工具验证。 我们Facebook有很好的使用类似工具的内部经验。
  • 使用代码生成静态类型和明确的 API - API中到处使用 interface{} 会影响开发人员的效率;特别是对项目新人。
  • 查询,聚合和图遍历 应该是简单的 - 开发者不想要处理 SQL 查询或SQL 条目。
  • 断言应是静态类型。 不会到处都是字符串类型
  • 全面支持 context.Context - 这有助于我们在追踪和日志系统中获得充分可见性。 而且,这对于其他功能,如取消等,非常重要。
  • 存储层无关 - 我们试图使用代码模板让存储层可以动态变化,开发者可以使用Gremlin (AWS Neptune)做初期开发然后后期切换到MySQL。

开源 ent

ent 是一个基于上述原则构建的 Go 的实体框架 (ORM)。 ent 可以使用 Go 代码轻松地定义任何数据模型或图结构;schema配置由 entc (ent codegen) 验证,这种配置生成了一个地道的静态类型的 API ,使开发人员能够富有生产性和幸福感。 它支持 MySQL, MariaDB, PostgreSQL, SQLite 和 Gremlin图数据库。

今天,我们正式开源 ent ,并邀请您开始试用 entgo.io/docs/getting-starting