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 ./...之后,从后到前的代码就全部生成完了。

参考资料

相关推荐
yuuki2332338 分钟前
【数据结构】顺序表的实现
c语言·数据结构·后端
一语长情21 分钟前
多线程同步实战指南:Python、Java与Go的等待之道
后端·面试·架构
摇滚侠44 分钟前
Spring Boot3零基础教程,RedisTemplate 定制化,笔记70
spring boot·笔记·后端
刘一说1 小时前
深入浅出 Spring Boot 自动配置(Auto-Configuration):原理、机制与最佳实践
java·spring boot·后端
程序员小假1 小时前
我们来说一说什么是联合索引最左匹配原则?
java·后端
豆苗学前端1 小时前
企业级用户登录Token存储最佳实践,吊打面试官
前端·javascript·后端
LSTM971 小时前
使用 C# 打印 PDF 文档:基于 Spire.PDF 的实战教程
后端
我命由我123451 小时前
PDFBox - PDF 页面坐标系、PDF 页面尺寸获取、PDF 页面位置计算
java·服务器·开发语言·笔记·后端·java-ee·pdf
文心快码BaiduComate1 小时前
冰城码力全开,共赴AI Coding英雄之旅!CEDxCNCC百度文心快码Meetup圆满落幕!
前端·后端·程序员