ent是一个简单而又功能强大的Go语言实体框架,ent易于构建和维护应用程序与大数据模型。
简而言之,ent是一款便于操作的orm框架
在连接ent之前,我们首先需要创建schema,创建schema的作用类似django创建model,规定数据表字段,定义表名等
cli创建model模板命令
目的是指定创建模板路径, 必须使用驼峰命名法
我们可以通过命令在目录下创建两个模板,class.go和student.go
如下所示:
我们在生成的模板内,将表字段添加进去
基于schema的定义(字段,索引,边,配置)来生成对应的数据表操作代码
目的是指定模板所在路径,根据所在目录下的模板来生成对应的代码
目的是指定生成操作代码的路径
使用将我们的模板生成实际的操作代码到路径下
之前我们在目录下生成了操作代码,可以看到在其中有一个client.go的文件,它就是我们连接数据库的操作文件,我们需要先创建模型生成代码之后再连接数据库的原因也在于此
常规方式连接数据库
整合使用sql.DB的方式连接数据库
上面介绍了数据库的连接,在实际使用中,我们往往并非在一个文件中编写所有的逻辑,所以需要将数据库的连接->client放在全局变量中
我们只需要在main方法中运行的时候执行方法就可以在之后的操作中使用app.EntClient来获取到数据库的client
创建数据
以之前我们创建的Class和Student表为例,我们可以在任意文件中使用如下代码
可以看到在保存的时候我们有两种方式和,内部实际上也是调用的,但区别在于不会返回类型,通常我们只会在单元测试用使用带的方法以保证我们的业务代码更加的健壮。
另外,由于我们在创建模型的时候使用了边(edge)为student和class创建了外键关联关系,因此我们可以在创建对象的时候使用来关联对象
批量创建数据
的对象不立马保存,而是储存在切片中,之后再统一使用的方法来批量创建数据
条件查询数据
和的关系和与的关系相似,一个不返回类型,一个则会返回它
在外键关联的情况下,我们可以通过后面接实体类名称的方式来关联查询另一张表的数据,我们可以在后面接方法后面能接的所有方法
模糊查询数据
可以通过Where方法中使用函数来间接达成模糊查询的作用
条件更新数据
假如时间过了一年,小红年龄增长一岁,并且年纪从一年级到了二年级,并且班级由三班变为一班,我们可以通过加方法来条件修改她的属性,同时由于有外键关联关系,所以我们可以使用后面跟Class对象名的方式来更新class表数据的变更
条件删除数据
我们可以通过加方法来条件删除一些数据,方法与上面的例子类似
在了解基本的操作之后我们还需要了解更多高级的操作接下来,我们将介绍联表查询,条件拼接查询以及在ent中直接使用sql查询等。
在ent中,想要进行联表查询我们首先需要给我们对应的表之间定义。通过可以绑定实体之间的关系,以此实现联表查询。
以和举例,一个用户可以有多个订单的场景下我们应该如何定义模型
可以看到,在这个例子中,我们使用 函数来定义 和 实体之间的一对多关系。在 实体中,我们使用 函数来定义一个名为 的 ,表示一个用户可以有多个订单。在 实体中,我们使用 函数来定义一个名为 的 ,表示一个订单只属于一个用户
当我们想要进行联表查询时就可以进行如下查询了:
以和举例,一个用户只拥有一份个人资料的情况下应该如何定义模型
可以看到,在这个例子中,我们使用 函数来定义 和 实体之间的一对一关系。在 实体中,我们使用 函数来定义一个名为 的 ,表示一个用户只能有一个个人资料。在 实体中,我们使用 函数来定义一个名为 的
例子举到这里,或许会有人发现, 的 和 非常奇怪。我们在O2M的例子中,用 表示可以有多个用表示一个只归属于一个。为什么到了O2O的列子中,依旧需要用到和来定义关系?而到底哪个才应该是来表示哪个应该用表示?
原因在于在ent框架中,和的使用并不完全取决于关系是一对多(O2M)还是一对一(O2O)。它们主要是用来定义边缘的方向,即数据关系的指向。
用来表示从当前模型指向另一个模型。例如,在模型中,表示从指向,即一个用户可以有多个订单。
用来表示从另一个模型指向当前模型。例如,在模型中,表示从指向,即一个订单只能归属于一个用户。
在一对一(O2O)的关系中,我们依然需要使用和来定义边缘的方向。例如,在和的例子中,我们在模型中使用来表示从指向,即一个用户只能有一个个人资料。同时,我们在模型中使用来表示从指向,即一个个人资料只能归属于一个用户。
总的来说,和的使用取决于你想要如何定义数据关系的指向,而不仅仅是关系的类型(一对多或一对一)
O2O的联表查询和O2M的查询方式基本一致,这里就不再赘述。
以和举例,一个用户可以存在多个用户组中,一个用户组也可以包含多个用户。这里根据实际场景我们有两种处理方式
方案一 我们需要自定义UserGroup中间表
方案二 我们选择ent为我们生成中间表