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地址