ent orm笔记1---快速尝鲜

全面揭秘 Go 语言超强 ORM 框架 Ent:高效构建数据库的终极武器! 阅读详情

前几天看到消息Facebook孵化的ORM ent转为正式项目,出去好奇,简单体验了一下,使用上自己感觉比GORM好用,于是打算把官方的文档进行整理,也算是学习一下如何使用。

安装

ent orm 需要使用entc命令进行自动代码生成,所以需要先安装entc:

go get github.com/facebook/ent/cmd/entc

关于这个系列的所有代码笔记都会放到

github.com/peanut-cc/ent_orm_notes

快速使用

创建schema

正常情况下应该是在自己的项目根目录执行下面的命令,我这里是因为后续会有多个例子,为了让每个例子的内容独立,所以这里会在子目录下执行该命令

entc init User

这个命令执行后生成如下目录结构:

└── quick_user_example
    └── ent
        ├── generate.go
        └── schema
            └── user.go

而schema目录下的user.go的内容也非常简单:

package schema

import "github.com/facebook/ent"

// User holds the schema definition for the User entity.
type User struct {
   ent.Schema
}

// Fields of the User.
func (User) Fields() []ent.Field {
   return nil
}

// Edges of the User.
func (User) Edges() []ent.Edge {
   return nil
}

给schema添加字段

给schema添加字段非常简单,只需要在生成ent/schema/user.go的Fields方法中添加即可,修改之后的代码如下:

package schema

import (
   "github.com/facebook/ent"
   "github.com/facebook/ent/schema/field"
)

// User holds the schema definition for the User entity.
type User struct {
   ent.Schema
}

// Fields of the User.
// 用于给 user 表定义字段
func (User) Fields() []ent.Field {
   return []ent.Field{
      field.Int("age").
         Positive(),
      field.String("name").Default("unknown"),
   }
}

// Edges of the User.
func (User) Edges() []ent.Edge {
   return nil
}

执行go generate ./ent 自动生成代码,执行命令后的目录结构为:

└── quick_user_example
    └── ent
        ├── client.go
        ├── config.go
        ├── context.go
        ├── ent.go
        ├── enttest
        │   └── enttest.go
        ├── generate.go
        ├── hook
        │   └── hook.go
        ├── migrate
        │   ├── migrate.go
        │   └── schema.go
        ├── mutation.go
        ├── predicate
        │   └── predicate.go
        ├── privacy
        │   └── privacy.go
        ├── runtime
        │   └── runtime.go
        ├── runtime.go
        ├── schema
        │   └── user.go
        ├── tx.go
        ├── user
        │   ├── user.go
        │   └── where.go
        ├── user_create.go
        ├── user_delete.go
        ├── user.go
        ├── user_query.go
        └── user_update.go

创建表到数据库

创建表并进行简单的添加数据,和查询数据:

package main

import (
   "context"
   "fmt"
   "log"

   _ "github.com/go-sql-driver/mysql"
   "github.com/peanut-pg/ent_orm_notes/quick_user_example/ent"
   "github.com/peanut-pg/ent_orm_notes/quick_user_example/ent/user"
)

func main() {
   client, err := ent.Open("mysql", "root:123456@tcp(192.168.1.104:3306)/ent_orm?parseTime=True")
   if err != nil {
      log.Fatal(err)
   }
   defer client.Close()
   ctx := context.Background()
   // run the auto migration tool
   if err := client.Schema.Create(ctx); err != nil {
      log.Fatalf("failed creating schema resources:%v", err)
   }
   CreateUser(ctx, client)
   peanut, err := QueryUser(ctx, client)
   if err != nil {
      log.Fatalln(err)
   }
   log.Fatalf("query user name is:%v, aget is %v", peanut.Name, peanut.Age)
}

// CreateUser 创建用户 name=peanut, age=18
func CreateUser(ctx context.Context, client *ent.Client) (*ent.User, error) {
   u, err := client.User.
      Create().
      SetAge(18).
      SetName("peanut").
      Save(ctx)
   if err != nil {
      return nil, fmt.Errorf("failed creating user: %v", err)
   }
   log.Println("user was created: ", u)
   return u, nil
}

// QueryUser 查询用户 where name=peanut
func QueryUser(ctx context.Context, client *ent.Client) (*ent.User, error) {
   u, err := client.User.
      Query().
      Where(user.NameEQ("peanut")).
      // `Only` fails if no user found,
      // or more than 1 user returned.
      Only(ctx)
   if err != nil {
      return nil, fmt.Errorf("failed querying user: %v", err)
   }
   log.Println("user returned: ", u)
   return u, nil
}

创建表关系

还是用同样的方法创建Car和Group 的schema

entc init Car Group

分别给ent/schema目录下的car.go和group.go添加对应的字段信息

car.go文件:

package schema

import (
 "github.com/facebook/ent"
 "github.com/facebook/ent/schema/field"
)

// Car holds the schema definition for the Car entity.
type Car struct {
 ent.Schema
}

// Fields of the Car.
func (Car) Fields() []ent.Field {
 return []ent.Field{
  field.String("model"),
  field.Time("registered_at"),
 }
}

// Edges of the Car.
func (Car) Edges() []ent.Edge {
 return nil
}

group.go文件:

package schema

import (
   "regexp"

   "github.com/facebook/ent"
   "github.com/facebook/ent/schema/field"
)

// Group holds the schema definition for the Group entity.
type Group struct {
   ent.Schema
}

// Fields of the Group.
func (Group) Fields() []ent.Field {
   return []ent.Field{
      field.String("name").
         // regexp validation for group name.
         Match(regexp.MustCompile("[a-zA-Z_]+$")),
   }
}

// Edges of the Group.
func (Group) Edges() []ent.Edge {
   return nil
}

在ent orm 中给表之间建立关系是通过Edges方法实现的,我们更改ent/schema/user.go中的Edges方法:

package schema

import (
   "github.com/facebook/ent"
   "github.com/facebook/ent/schema/edge"
   "github.com/facebook/ent/schema/field"
)

// User holds the schema definition for the User entity.
type User struct {
   ent.Schema
}

// Fields of the User.
// 用于给 user 表定义字段
func (User) Fields() []ent.Field {
   return []ent.Field{
      field.Int("age").
         Positive(),
      field.String("name").Default("unknown"),
   }
}

// Edges of the User.
// 和Cars表建立关系
func (User) Edges() []ent.Edge {
   return []ent.Edge{
      edge.To("cars", Car.Type),
   }
}

执行go generate ./ent 自动生成代码,然后重新生成一下表结构

然后在数据中执行show create table ent_orm.cars 查看表的详细结构语句:

CREATE TABLE `cars` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `model` varchar(255) COLLATE utf8mb4_bin NOT NULL,
  `registered_at` timestamp NULL DEFAULT NULL,
  `user_cars` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `cars_users_cars` (`user_cars`),
  CONSTRAINT `cars_users_cars` FOREIGN KEY (`user_cars`) REFERENCES `users` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

可以看出,通过在印记功能建立的外键关系

外键的数据添加

// CreateCars 创建 Tesla 和Ford 汽车,加该汽车属于user: peanut_pg
func CreateCars(ctx context.Context, client *ent.Client) (*ent.User, error) {
   // creating new car with model "Tesla".
   tesla, err := client.Car.
      Create().
      SetModel("Tesla").
      SetRegisteredAt(time.Now()).
      Save(ctx)
   if err != nil {
      return nil, fmt.Errorf("failed creating car: %v", err)
   }

   // creating new car with model "Ford".
   ford, err := client.Car.
      Create().
      SetModel("Ford").
      SetRegisteredAt(time.Now()).
      Save(ctx)
   if err != nil {
      return nil, fmt.Errorf("failed creating car: %v", err)
   }
   log.Println("car was created: ", ford)

   // create a new user, and add it the 2 cars.
   peanut_pg, err := client.User.
      Create().
      SetAge(18).
      SetName("peanut_pg").
      // AddCars 将车属于user peanut_pg
      AddCars(tesla, ford).
      Save(ctx)
   if err != nil {
      return nil, fmt.Errorf("failed creating user: %v", err)
   }
   log.Println("user was created: ", peanut_pg)
   return peanut_pg, nil
}

外键的查询

代码内容如下:

package main

import (
   "context"
   "fmt"
   "log"
   "time"

   _ "github.com/go-sql-driver/mysql"
   "github.com/peanut-pg/ent_orm_notes/quick_user_example/ent"
   "github.com/peanut-pg/ent_orm_notes/quick_user_example/ent/car"
   "github.com/peanut-pg/ent_orm_notes/quick_user_example/ent/user"
)

func main() {
   client, err := ent.Open("mysql", "root:123456@tcp(192.168.1.104:3306)/ent_orm?parseTime=True")
   if err != nil {
      log.Fatal(err)
   }
   defer client.Close()
   ctx := context.Background()
   // run the auto migration tool
   if err := client.Schema.Create(ctx); err != nil {
      log.Fatalf("failed creating schema resources:%v", err)
   }
   peanut_pg, err := QueryUserByName(ctx, client, "peanut_pg")
   if err != nil {
      log.Fatalln(err)
   }
   QueryCars(ctx, peanut_pg)
}

// QueryUserByName 通过name 查询
func QueryUserByName(ctx context.Context, client *ent.Client, name string) (*ent.User, error) {
   u, err := client.User.
      Query().
      Where(user.NameEQ(name)).
      // `Only` fails if no user found,
      // or more than 1 user returned.
      Only(ctx)
   if err != nil {
      return nil, fmt.Errorf("failed querying user: %v", err)
   }
   log.Println("user returned: ", u)
   return u, nil
}

// QueryCars 查询用户peanut_pg是否有Ford 这个车
func QueryCars(ctx context.Context, peanut_pg *ent.User) error {
   cars, err := peanut_pg.QueryCars().All(ctx)
   if err != nil {
      return fmt.Errorf("failed querying user cars: %v", err)
   }
   log.Println("returned cars:", cars)

   // what about filtering specific cars.
   ford, err := peanut_pg.QueryCars().
      Where(car.ModelEQ("Ford")).
      Only(ctx)
   if err != nil {
      return fmt.Errorf("failed querying user cars: %v", err)
   }
   log.Println(ford)
   return nil
}

反向查询

在平常的查询中我们还会经常用到一些反向查询,如我们想要查询这个车所属的用户是谁,这个时候需要修改

ent/schema/car.go 中的Edges方法:

package schema

import (
 "github.com/facebook/ent"
 "github.com/facebook/ent/schema/edge"
 "github.com/facebook/ent/schema/field"
)

// Car holds the schema definition for the Car entity.
type Car struct {
 ent.Schema
}

// Fields of the Car.
func (Car) Fields() []ent.Field {
 return []ent.Field{
  field.String("model"),
  field.Time("registered_at"),
 }
}

// Edges of the Car.
func (Car) Edges() []ent.Edge {
 return []ent.Edge{
  edge.From("owner", User.Type).
   // create an inverse-edge called "owner" of type `User`
   // and reference it to the "cars" edge (in User schema)
   // explicitly using the `Ref` method.
   Ref("cars").
   // setting the edge to unique, ensure
   // that a car can have only one owner.
   Unique(),
 }
}

先通过QueryCarByModel 查询一个Model=Tesla的汽车,然后通过QueryCarUser查看这个汽车的所属者是谁

// QueryCarByModel 查询car.model=Tesla
func QueryCarByModel(ctx context.Context, client *ent.Client) (*ent.Car, error) {
 car, err := client.Car.Query().
  Where(car.ModelEQ("Tesla")).
  Only(ctx)
 if err != nil {
  return nil, fmt.Errorf("failed query car")
 }
 return car, nil
}

// QueryCarUser 查询car.model=Tesla的所属者是谁
func QueryCarUser(ctx context.Context, car *ent.Car) error {
 owner, err := car.QueryOwner().Only(ctx)
 if err != nil {
  return fmt.Errorf("failed querying car %q owner:%v", car.Model, err)
 }
 log.Printf("car %q owner: %q\n", car.Model, owner.Name)
 return nil
}

复杂查询

在上面的关系上再添加一个用户和组的关系,分别修改ent/schema/user.go和ent/schema/car.go 的Edges方法

// Edges of the User.
// 和Cars表建立关系
func (User) Edges() []ent.Edge {
   return []ent.Edge{
      edge.To("cars", Car.Type),
      // create an inverse-edge called "groups" of type `Group`
      // and reference it to the "users" edge (in Group schema)
      // explicitly using the `Ref` method.
      edge.From("groups", Group.Type).
         Ref("users"),
   }
}
// Edges of the Car.
func (Car) Edges() []ent.Edge {
   return []ent.Edge{
      edge.From("owner", User.Type).
         // create an inverse-edge called "owner" of type `User`
         // and reference it to the "cars" edge (in User schema)
         // explicitly using the `Ref` method.
         Ref("cars").
         // setting the edge to unique, ensure
         // that a car can have only one owner.
         Unique(),
   }
}

执行go generate ./ent 自动生成代码

通过如下方法生成基础数据:

// CreateGraph 创建基础数据
func CreateGraph(ctx context.Context, client *ent.Client) error {
   // first, create the users.
   a8m, err := client.User.
      Create().
      SetAge(30).
      SetName("Ariel").
      Save(ctx)
   if err != nil {
      return err
   }
   neta, err := client.User.
      Create().
      SetAge(28).
      SetName("Neta").
      Save(ctx)
   if err != nil {
      return err
   }
   // then, create the cars, and attach them to the users in the creation.
   _, err = client.Car.
      Create().
      SetModel("TeslaY").
      SetRegisteredAt(time.Now()). // ignore the time in the graph.
      SetOwner(a8m).               // attach this graph to Ariel.
      Save(ctx)
   if err != nil {
      return err
   }
   _, err = client.Car.
      Create().
      SetModel("TeslaX").
      SetRegisteredAt(time.Now()). // ignore the time in the graph.
      SetOwner(a8m).               // attach this graph to Ariel.
      Save(ctx)
   if err != nil {
      return err
   }
   _, err = client.Car.
      Create().
      SetModel("TeslaS").
      SetRegisteredAt(time.Now()). // ignore the time in the graph.
      SetOwner(neta).              // attach this graph to Neta.
      Save(ctx)
   if err != nil {
      return err
   }
   // create the groups, and add their users in the creation.
   _, err = client.Group.
      Create().
      SetName("GitLab").
      AddUsers(neta, a8m).
      Save(ctx)
   if err != nil {
      return err
   }
   _, err = client.Group.
      Create().
      SetName("GitHub").
      AddUsers(a8m).
      Save(ctx)
   if err != nil {
      return err
   }
   log.Println("The graph was created successfully")
   return nil
}

「三种查询例子」

// QueryGithub 查询group = GitHub 的用户的所有的汽车
func QueryGithub(ctx context.Context, client *ent.Client) error {
   cars, err := client.Group.
      Query().
      Where(group.Name("GitHub")).
      QueryUsers().
      QueryCars().
      All(ctx)
   if err != nil {
      return fmt.Errorf("failed getting cars:%v", err)
   }
   // cars returned: [Car(id=3, model=TeslaY, registered_at=Tue Aug 25 00:43:55 2020) Car(id=4, model=TeslaX, registered_at=Tue Aug 25 00:43:55 2020)]
   log.Println("cars returned:", cars)
   return nil
}
func QueryArielCars(ctx context.Context, client *ent.Client) error {
   // Get "Ariel" from previous steps.
   a8m := client.User.
      Query().
      Where(
         user.HasCars(),
         user.Name("Ariel"),
      ).
      OnlyX(ctx)
   cars, err := a8m.          // Get the groups, that a8m is connected to:
            QueryGroups().    // (Group(Name=GitHub), Group(Name=GitLab),)
            QueryUsers().     // (User(Name=Ariel, Age=30), User(Name=Neta, Age=28),)
            QueryCars().      //
            Where(            //
         car.Not(                  //  Get Neta and Ariel cars, but filter out
            car.ModelEQ("TeslaX"), //  those who named "Mazda"
         ),
      ).
      All(ctx)
   if err != nil {
      return fmt.Errorf("failed getting cars: %v", err)
   }
   log.Println("cars returned:", cars)
   // Output: (Car(Model=Tesla, RegisteredAt=<Time>), Car(Model=Ford, RegisteredAt=<Time>),)
   return nil
}
// QueryGroupWithUsers 查询所有由用户的组
func QueryGroupWithUsers(ctx context.Context, client *ent.Client) error {
   groups, err := client.Group.
      Query().
      Where(group.HasUsers()).
      All(ctx)
   if err != nil {
      return fmt.Errorf("failed getting groups: %v", err)
   }
   log.Println("groups returned:", groups)
   // Output: (Group(Name=GitHub), Group(Name=GitLab),)
   return nil
}

延伸阅读

  • https://entgo.io/docs/getting-started/

【go-zero】simple-admin框架 整合ent 框架实现mysql批量[插入]与[修改] | ent批量插入mysql | ent批量修改mysql 阅读详情

相关推荐

新手避坑指南:用COMSOL Multiphysics仿真气体放电(汤逊vs.流注)

本文详细介绍了使用COMSOL Multiphysics仿真气体放电的实战指南,涵盖汤逊理论和流注模型的实现方法。通过对比两种放电模型的关键参数和物理场配置,帮助新手避免常见错误,准确预测气体击穿过程。文章还提供了工程应用案例,如高压绝缘子设计优化,展示了仿真技术在电力设备绝缘设计中的实际价值。

weixin_28716181的博客 472

Golang-Ent ORM框架

面向对象编程和关系型数据库,都是目前最流行的技术,但是它们的模型是不一样的。面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据。很早就有人提出,关系也可以用对象表达,这样的话,就能使用面向对象编程,来操作关系型数据库。简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。ORM 把数据库映射成对象。

Ch3nnn的博客 2932

别再怕无霍尔BLDC了!手把手教你用反电动势过零检测搞定电机换向(附STM32代码片段)

本文详细介绍了无霍尔传感器BLDC电机的驱动方法,重点讲解反电动势过零检测技术及其在STM32上的实现。通过硬件电路设计、信号调理和软件算法优化,手把手教你完成电机换向控制,并提供实用的调试技巧和代码片段,帮助开发者快速掌握无霍尔BLDC驱动技术。

weixin_42522575的博客 492

go语言ORM框架ent使用教程

ent是什么 ent是一个简单而又功能强大的Go语言实体框架,ent易于构建和维护应用程序与大数据模型。 简而言之,ent是一款便于操作的orm框架 installation go get entgo.io/ent/cmd/ent 使用 创建schema 在连接ent之前,我们首先需要创建schema,创建schema的作用类似django创建model,规定数据表字段,定义表名等 cli创建model模板命令 ent init --target <target dirpath> <Mod

爱吃回锅肉的胖子 1万+

阿里云CDN HTTPS 证书配置流程

可以使用HTTPS方式访问资源,如果浏览器中URL旁边出现锁的HTTPS标识,表示HTTPS安全加速已生效。: 证书配置完成后,需要留意证书过期时间并在证书过期前手动配置新的证书。注意 ⚠️ 一定是需要复制 以下标识之间的内容。如果已在阿里云数字证书管理服务中购买了证书,请选择。,该证书将在阿里云数字证书管理服务中保存。如果使用第三方服务商签发的证书,请选择。第四步,在指定域名的左侧导航栏,单击。第二步,在左侧导航栏,单击。开关,并配置证书相关参数。页面,找到目标域名,单击。中选择已购买的证书。

w风雨无阻w的专栏 2208

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第9套模块A:网络构建 & (三)无线网络配置+(四)出口网络配置-命令配置

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第9套模块A:网络构建 & (三)无线网络配置+(四)出口网络配置-命令配置

君逍遥o 1017

ent4/ent比较分析:与其他ORM框架的优劣对比

在现代软件开发中,对象关系映射(ORM,Object-Relational Mapping)框架扮演着至关重要的角色,它能够简化数据访问层的开发,提高开发效率,同时减少手动编写SQL的错误。ent4/ent作为Go语言生态中一款新兴的ORM框架,以其独特的设计理念和强大的功能受到了广泛关注。本文将从多个维度对ent4/ent与其他主流ORM框架进行深入比较,分析其优势与不足,帮助开发者做出更合适的...

gitblog_00345的博客 462

【硬刚Hadoop】HADOOP MAPREDUCE(1):概述

本文是对《【硬刚大数据之学习路线篇】从零到大数据专家的学习指南(全面升级版)》的Hadoop部分补充。 1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 2MapReduce优缺点 2.1 优点 1)MapReduce易于编程 它简单的实现一些接口,就可以完成一个分布式程序..

微信搜:import_bigdata,大数据领域硬核原创作者 462

ent orm笔记4---Code Generation

在前面几篇文章中,我们经常使用的可能就是entc这个命令了,entc这个工具给带来了很多功能,这篇文章主要整理关于ent orm 中Code Generation之前的例子中有个知识点少...

后场技术 1112

【Pix4d精品教程】Pix4d空三后处理:点云分类与过滤、DSM精编生成DEM、生成等高线案例详解

本文详细介绍了利用Pix4D软件进行无人机摄影测量后处理的关键步骤,主要包括点云分类与分配、DEM精编生成和等高线绘制三个核心环节。首先通过点云分类区分地面、植被等7种地物类型,然后通过点云分配将地面点云归并到Ground类别,剔除植被等干扰要素。随后重新运行DSM生成步骤获取精确DEM,最后在附加输出中设置参数生成标准等高线。文中配有详细的操作截图和注意事项,如处理前需备份原始DSM/DOM数据,并解释了DEM与DSM的本质区别。该教程为无人机摄影测量内业处理提供了完整的解决方案。

智慧空间实验室 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

终极ent迁移指南:从其他ORM快速切换到ent的完整步骤

ent是Go语言中简单而强大的实体框架,让构建和维护大型数据模型的应用变得轻松。如果你正在使用其他ORM(如GORM、sqlx或标准库database/sql),本文将为你提供从其他ORM迁移到ent的完整指南。 ## 为什么要从其他ORM迁移到ent? 🚀 ent提供了许多其他ORM不具备的优势: - **代码即架构** - 将任何数据库架构建模为Go对象 - **轻松遍历任何图形**

gitblog_00904的博客 639

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

搞懂常见Go ORM系列-Ent框架详解

Ent 是一个用于 Go 语言的 ORM(对象关系映射)框架它的最大特点是通过代码生成的方式,提供类型安全的数据库访问能力在使用 Ent 时,首先需要定义 schema,然后通过工具生成数据库访问代码,这样不仅提高了开发效率,还能避免常见的运行时错误Ent 支持多种关系型数据库,包括 MySQL、PostgreSQL、SQLite 和 Microsoft SQL Server,并且对数据库结构和关系的支持非常全面在使用 Ent 时,开发者需要先定义 schema,这是 Ent 中模型的基础。

2401_89221445的博客 2279

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Go ORM 框架选型:GORM、Ent 和 sqlc 各自适合什么场景

Go 生态的 ORM 选型不像 Java 那样有一个 Hibernate 级别的"标准答案"。GORM 用户基数最大,Ent 来自 Facebook 的实践沉淀,sqlc 则代表了另一种流派——直接从 SQL 生成类型安全的 Go 代码。三者的设计理念差异不是"谁更好"的问题,而是"谁的假设更匹配你的项目"的问题。很多团队在技术选型时只关注"好不好写",忽略了两个更重要的维度:出问题时排查难度、长期维护的代码腐化速度。ORM 生成的那些隐式 SQL,最终会在凌晨三点的 oncall 中变成调试噩梦。

m0_50889382的博客 6663

超强ent4/ent框架:代码生成驱动的静态类型ORM新范式

你还在为手写SQL、处理复杂数据关系而烦恼吗?ent4/ent框架通过代码生成和静态类型检查,让数据访问层开发效率提升10倍!本文将带你快速掌握这一革命性ORM工具的核心优势、5分钟上手流程及实战技巧,让你彻底告别重复劳动,专注业务逻辑开发。 ## 核心特性一览 ent4/ent作为Go语言生态中领先的ORM框架,凭借代码生成驱动和静态类型安全两大核心优势,彻底改变了传统ORM的开发模式。以下...

gitblog_00215的博客 703

Golang ORM ent

ent 是一个简单而又强大的Go实体框架 简单地使用数据库结构作为图结构。 使用Go代码定义结构 基于代码生成的静态类型 容易地进行数据库查询和图遍历 容易地使用Go模板扩展和自定义 应用场景 ent非常适合处理各种复杂的关系,定义好实体和实体之间的关系,就可以快速得到各种想要的数据 核心概念 Schema: 描述一个实体的定义以及他与其他实体的关系 Edges:实体与实体之间的关系称为边 ===>edge 使用步骤 安装 go get entgo.io/ent/cmd/ent 创

qq_39297673的博客 1106

Go Ent 简介

Go Ent 简介

闲余知道 1482

ogent:为Ent ORM打造的OpenAPI代码生成器

ogent:为Ent ORM打造的OpenAPI代码生成器 项目介绍 ogent是一个为Ent ORM设计的代码生成器扩展,它利用ogen的强大功能,为entoas生成的OpenAPI规范文档提供类型安全、无反射的实现。ogent生成了ogen所需的缺失处理程序实现,以便为描述的API提供服务。数据访问通过Ent完成。 项目技术分析 ogent的核心技术栈包括: Ent ORM:一个强大的Go语...

gitblog_00048的博客 756

ent-contrib:为ent框架注入新活力的扩展集合

ent-contrib:为ent框架注入新活力的扩展集合 项目介绍 ent-contrib 是一个为 ent 框架量身定制的扩展和工具集合。ent 是一个简单而强大的 Go 语言 ORM 框架,旨在简化数据库操作和模型定义。ent-contrib 通过提供一系列扩展和工具,进一步增强了 ent 的功能,使其在复杂应用场景中更加得心应手。 项目技术分析 ent-contrib 的核心价值在于其丰富的...

gitblog_00230的博客 853

初学者友好:Go-Kratos 集成 go-crud,Ent ORM CRUD 无需重复编码,轻松上手

摘要(149字): 本文介绍如何为Go-Kratos微服务框架集成go-crud工具,简化Ent ORM的CRUD操作。通过kratos-ent-example基础项目,step-by-step指导完成:1) 理解工具分工(Kratos框架核心、Ent类型安全ORM、go-crud封装层);2) 环境准备与项目初始化;3) 集成go-crud的Ent客户端到数据层;4) 使用schema定义用户模型并自动生成代码;5) 利用go-crud预置方法实现增删改查业务逻辑。该方法可避免重复编写基础CRUD代码,显

喵个咪的专栏 609

终极指南:如何快速掌握 Go ORM 框架的完整教程

Go ORM(Object-Relational Mapping)框架是连接Go语言与数据库的桥梁,能够帮助开发者更高效地处理数据持久化。本指南将带你了解最受欢迎的Go ORM框架,掌握选择和使用ORM的核心技巧,让数据库操作变得简单而高效。 ## 为什么选择 Go ORM 框架? 在Go开发中,直接使用原生SQL虽然灵活,但会带来大量重复工作和潜在错误。ORM框架通过将数据库表映射为Go结构

gitblog_00386的博客 705

Go开发者的终极选择:ent4/ent框架完整上手指南

ent4/ent是一个功能强大的Go语言ORM框架,专为构建高效、可维护的数据访问层而设计。它提供了直观的API、自动代码生成和灵活的查询能力,帮助开发者轻松处理数据库操作,显著提升开发效率。无论你是Go语言新手还是有经验的开发者,ent4/ent都能为你的项目带来极大的便利。 ## 为什么选择ent4/ent框架? ent4/ent框架凭借其独特的特性,成为Go开发者的理想选择。它采用代码优

gitblog_00710的博客 398

Flash-Attention的PyTorch与CUDA版本兼容修复:从安装OOM到稳定跑通

凌晨一点,你执行 `pip install flash-attn --no-build-isolation`,进度条卡在 68%,终端滚出 `nvcc fatal: out of memory`,而下午刚升级过的 torch 又让旧装的 flash-attn 抛 `undefined symbol`。这两个报错背后是同一条依赖链:flash-attn、PyTorch、CUDA 工具链、GPU 架构

gitblog_01153的博客 551

Modern Go Application数据库集成指南:Ent ORM与MySQL最佳实践

Modern Go Application是一个现代化的Go应用示例项目,它展示了如何使用Ent ORM与MySQL数据库进行高效集成。本指南将详细介绍这一集成过程,帮助开发者快速掌握在Go项目中使用Ent ORM操作MySQL数据库的最佳实践。 ## 为什么选择Ent ORM与MySQL组合 在Go开发中,选择合适的ORM工具和数据库对于项目的成功至关重要。Ent ORM作为一款功能强大的G

gitblog_00387的博客 963

ent orm笔记2---schema使用(上)

在上一篇关于快速使用ent orm的笔记中,我们在最开始使用entc init User 创建schema,在ent orm 中的schema 其实就是数据库模型,在schema中我们可...

后场技术 1659
上一篇: 搭建K8S集群之node节点部署
下一篇: ent orm笔记2---schema使用(上)
后场技术
博客等级 码龄11年 156粉丝 46原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值