跳到主要内容

介绍 ent

· 阅读需 4 分钟

Facebook 连接中心以色列分部的 Go 状态

20 个月前,我加入了 Facebook Connectivity(FBC)团队,地点是以色列特拉维夫。此前我已经有大约 5 年的 Go 编程经验,并在几家公司将其嵌入到产品中。

我加入的团队正在进行一个新项目,必须为此任务选择一种语言。我们比较了几种语言,并决定采用 Go。

从那时起,Go 继续在其他 FBC 项目中扩散,并在特拉维夫仅有的 15 名 Go 工程师中取得了巨大成功。新的服务现在都是用 Go 编写的

编写新的 Go ORM 的动机

在 Facebook 加入之前,我 5 年的工作大多是基础设施工具和微服务开发,并没有太多的数据模型工作。需要与 SQL 数据库做少量工作的一项服务使用了现有的开源方案,但若需要处理更为复杂的数据模型,则使用了在另一种语言中实现的强大 ORM,例如 Python + SQLAlchemy。

在 Facebook,我们喜欢用图形概念来思考数据模型。我们在内部对此模型有过良好体验。缺乏一个合适的基于图的 Go ORM,促使我们在这里编写一个,遵循以下原则:

  • Schema As Code:在 Go 代码中(而非 struct tag)定义类型、关系和约束,并使用 CLI 工具进行验证。我们在 Facebook 内部已有类似工具的良好经验。
  • 静态类型且明确的 API:使用代码生成。全局使用 interface{} 的 API 会降低开发者效率,尤其是新人。
  • 查询、聚合和图遍历应当简单——开发者不想处理原始 SQL 语句或 SQL 术语。
  • 谓词应为静态类型:不要随处使用字符串。
  • 完全支持 context.Context——这有助于我们在跟踪和日志系统中获得完整可见性,并且对取消等功能至关重要。
  • 存储无关:我们尝试通过代码生成模板保持存储层动态,最初在 Gremlin(AWS Neptune)上开发,后续切换到 MySQL。

开源 ent

ent 是一个基于上述原则构建的 Go 实体框架(ORM)。它使得在 Go 代码中轻松定义任何数据模型或图结构成为可能;模式配置由 entc(ent 的代码生成器)验证,生成符合惯用法且静态类型化的 API,从而保持 Go 开发者的高效与满意。它支持 MySQL、MariaDB、PostgreSQL、SQLite 以及基于 Gremlin 的图数据库。

我们今天开源 ent,邀请你开始使用 → entgo.io/docs/getting-started