Go实体框架 Ent 与 Gdao


实体框架如 Ent 和 GDAO在团队项目中有着重要意义;它们通过自动化代码生成、类型安全和简化数据库操作,显著提升开发效率。它们减少了开发者的重复劳动,确保了查询和数据模型的类型安全,并提高了维护性。特别在处理复杂数据关系和查询时,这些框架通过简化操作逻辑,让开发者专注于业务逻辑,从而提高了开发效率并减少了出错的机会。

框架介绍

Ent :

Ent 是一个由 Facebook 开发的 Go ORM 框架,主要特点是类型安全、强大的数据建模能力以及对复杂关系的支持。Ent 的核心思想是通过代码生成来简化数据库操作,特别是在处理复杂的数据模型和关系时,能够通过定义 Schema 自动生成数据模型及查询方法。Ent 主要通过类型安全和图数据模型来优化数据库操作,特别适合需要复杂关系查询和数据建模的应用。


Gdao :

GDAO 是一个 Go 语言的 ORM 框架,结合了实体(Entity)映射和 SQL 映射的功能。它的设计目标是通过代码生成来简化数据库操作,同时在复杂的数据查询场景下提供原生 SQL 支持。GDAO 强调高性能,支持多数据源整合、读写分离,并且通过 SQL 与程序的分离,提供灵活的动态 SQL 功能。它适合那些需要对持久层进行灵活配置的应用场景,尤其是当涉及到复杂查询时,GDAO 提供了 SQL 映射模块来处理这些需求。


生成的实体文件比较:
  • Ent生成的文件,可以参考 demo 生成的文件
  • Gdao生成的文件,可以参考 demo 生成的文件


Gdao与Ent 都是实体框架,它们有许多相似的地方:
  1. 类型安全:生成数据模型和查询 API 是完全类型安全的,因此在开发过程中可以避免很多运行时错误。
  2. 代码生成:  使用代码生成技术,生成相应的 CRUD 操作和查询方法,这些代码能够直接访问数据库。
  3. 对象封装:都提供了对查询结果的对象封装,将数据库中的数据映射到 Go 语言的结构体中。


Gdao与Ent 的不同之处:
  1. 代码生成方式:    
    • Gdao: 基于数据库的表结构生成实体类,自动将表结构映射为实体类,无需手动定义 Schema。
    • Ent: 需要开发者手动定义 Schema,根据定义的模型生成代码,支持更灵活的模型定义。
  2. 图模型支持
    • Gdao: 主要支持单表的 CRUD 操作,复杂的多表关联查询需要使用 SqlBuilder 或其他模块来处理。
    • Ent: 支持复杂的关系定义,能够在 Schema 中定义多表之间的关联关系,适合处理图数据模型和复杂查询。
  3. 数据库支持
    • Gdao: 支持所有实现了 Go 数据库驱动接口的数据库,具有更广泛的数据库兼容性
    • Ent: 目前支持 MySQL、PostgreSQL、SQLite、MariaDB 等常见的关系型数据库,适合较为标准化的数据库环境
  4. 复杂度
    • GDAO: 较为简单,数据库连接后自动生成映射文件,开发者只需进行数据库连接配置即可
    • Ent: 相对复杂,需要手动定义 Schema 和进行代码生成,适合复杂的数据模型和关系的应用。



使用场景:
  • Gdao 适合业务需求复杂多变的场景,尤其是需要大量单表CRUD与复杂业务数据查询情况并存的场景。它通过表映射自动生成代码,使得开发者节约大量的编写相似的增删改查代码。并通过SqlBuilder或Mapper映射等方式支持编写复杂Sql,来控制需要细粒度优化的Sql语句。
  • Ent 则适合需要复杂数据模型和关系的项目,特别是在需要处理图数据模型时,它通过类型安全和复杂的 Schema 定义提供了强大的关系映射生成功能,它隐藏了SQL执行的具体行为,关注于模型之间的关系,非常类似java经典ORM框架Hibernate。




性能对比:

在性能方面,Gdao略有优势,从基准压测数据上分析,Gdao的性能大约为Ent的1.5-2倍左右,以下是数据查询在多种运行方式下的 基准压测结果截图,

分别是

  • 驱动执行原生SQL(BenchmarkSerial_Native_*),
  • Gdao(BenchmarkSerial_gdao_*)
  • Gorm(BenchmarkSerial_gorm_*)
  • SqlX(BenchmarkSerial_sqlx_*)
  • Ent(BenchmarkSerial_ent_*)

在PostgreSql与Mysql数据库场景中的压测数据


压测结果分析:
  • 在PostgreSql中,Gdao与Gorm的性能较为接近在(130 - 150 μs/op),而 原生sql执行,sqlx,ent的性能较为接近在(240 - 280 μs/op)。
  • 在Mysql中 ,Gdao性能在(170 - 200 μs/op)而 原生sql执行,sqlx,gorm,ent的性能接近(290 - 350 μs/op)。
  • 对应orm的基准压测数据库可以参考《Gdao—orm框架性能压测 gdao+gorm+sqlx+原生sql执行》

压测程序与数据结果的 Github地址