Ent代码生成工具链

Ent代码生成工具链

Ent是Facebook开源的一个GO语言的ORM框架。它提供了一系列的工具,可以做到:

  1. SQL生成schema;
  2. schema生成protobuf的message;
  3. schema生成gPRC的service。

创建go项目

bash 复制代码
go mod init entimport-example

初始化ent的文件夹

bash 复制代码
mkdir ./ent/schema

SQL生成schema

text 复制代码
Usage of entimport:

  -dsn string
        data source name (connection information), for example:
        "mysql://user:pass@tcp(localhost:3306)/dbname"
        "postgres://user:pass@host:port/dbname"
  -exclude-tables value
        comma-separated list of tables to exclude
  -schema-path string
        output path for ent schema (default "./ent/schema")
  -tables value
        comma-separated list of tables to inspect (all if empty)

MySQL

sql 复制代码
CREATE TABLE users
(
    id        bigint auto_increment PRIMARY KEY,
    age       bigint       NOT NULL,
    name      varchar(255) NOT NULL,
    last_name varchar(255) NULL comment 'surname'
);

CREATE TABLE cars
(
    id          bigint auto_increment PRIMARY KEY,
    model       varchar(255) NOT NULL,
    color       varchar(255) NOT NULL,
    engine_size mediumint    NOT NULL,
    user_id     bigint       NULL,
    CONSTRAINT cars_owners FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE SET NULL
);

导出表结构:

bash 复制代码
go run -mod=mod ariga.io/entimport/cmd/entimport \
                -dsn "mysql://root:pass@tcp(localhost:3306)/entimport"

Postgresql

sql 复制代码
CREATE TABLE users (
    id bigserial PRIMARY KEY,
    age bigint NOT NULL,
    name varchar(255) NOT NULL,
    last_name varchar(255) NULL
);

CREATE TABLE cars (
    id bigserial PRIMARY KEY,
    model varchar(255) NOT NULL,
    color varchar(255) NOT NULL,
    engine_size int NOT NULL,
    user_id bigint NULL,
    CONSTRAINT cars_owners FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
);

导出表结构:

bash 复制代码
go run -mod=mod ariga.io/entimport/cmd/entimport \
                -dsn "postgres://postgres:123456@localhost:5432/entimport?sslmode=disable"

schema生成proto

我们首先需要修改生成出来的Schema,修改ent/schema/user.goAnnotations方法:

go 复制代码
func (User) Annotations() []schema.Annotation {
    return []schema.Annotation{
        entproto.Message(),
        entproto.Service(
            entproto.Methods(
                entproto.MethodCreate | entproto.MethodGet | entproto.MethodList | entproto.MethodBatchCreate
                ),
        ),
    }
}

其中,entproto.Message()标识着将为该表生成proto的messageentproto.Service标志着为该表生成gRPC的service,而entproto.Methods则可以控制生成的service中的方法。

然后,还需要给每一个字段添加entproto.Field

go 复制代码
// Fields of the User.
func (User) Fields() []ent.Field {
    return []ent.Field{
        field.String("name").
            Unique().
            Annotations(
                entproto.Field(2),
            ),
        field.String("email_address").
            Unique().
            Annotations(
                entproto.Field(3),
            ),
    }
}

修改完代码,需要先生成ent代码:

bash 复制代码
go run -mod=mod entgo.io/ent/cmd/ent generate ./schema

现在就可以生成proto文件了:

bash 复制代码
go run -mod=mod entgo.io/contrib/entproto/cmd/entproto -path ./schema

我们可以把这两个命令写入到ent/generate.go:

go 复制代码
package ent

//go:generate go run -mod=mod entgo.io/ent/cmd/ent generate ./schema
//go:generate go run -mod=mod entgo.io/contrib/entproto/cmd/entproto -path ./schema

这时候就可以执行下面的命令来执行生成:

go 复制代码
go generate ./...

生成的代码为:

bash 复制代码
ent/proto
└── entpb
    ├── entpb.proto
    └── generate.go

需要注意的是ent/proto/entpb/generate.go中的生成命令需要做一定的修改:

go 复制代码
package entpb

//go:generate protoc --go_out=.. --go-grpc_out=.. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --entgrpc_out=.. --entgrpc_opt=paths=source_relative,schema_path=..\..\schema entpb.proto

利用ent/proto/entpb/generate.go,我们可以从proto生成go的代码。

在生成之前,我们还需要安装protoc的3个插件:

bash 复制代码
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
go install entgo.io/contrib/entproto/cmd/protoc-gen-entgrpc@master

当我们再次执行go generate ./...之后,从后到前的代码就全部生成完了。

参考资料

相关推荐
22:30Plane-Moon9 分钟前
初识SpringBoot
java·spring boot·后端
苏三说技术13 分钟前
分布式事务问题的 7 种常见解决方案!
后端
追逐时光者26 分钟前
一款基于 .NET + Vue 编写的仿钉钉的开源低代码工作流引擎,支持多种数据库,开箱即用!
后端·.net
CodeUp.2 小时前
基于SpringBoot的OA办公系统的设计与实现
spring boot·后端·mybatis
小醉你真好2 小时前
Spring Boot + ShardingSphere 分库分表实战
java·spring boot·后端·mysql
Jacob02343 小时前
Node.js 性能瓶颈与 Rust + WebAssembly 实战探索
后端·rust·node.js
王中阳Go3 小时前
分库分表之后如何使用?面试可以参考这些话术
后端·面试
知其然亦知其所以然3 小时前
ChatGPT太贵?教你用Spring AI在本地白嫖聊天模型!
后端·spring·ai编程
kinlon.liu4 小时前
内网穿透 FRP 配置指南
后端·frp·内网穿透
kfyty7254 小时前
loveqq-mvc 再进化,又一款分布式网关框架可用
java·后端