メインコンテンツへスキップする

Introduction

インストール#

このプロジェクトは ent と呼ばれるコード生成ツールを備えています。 ent をインストールするには、次のコマンドを実行します。

go get entgo.io/ent/cmd/ent

新しいスキーマの初期化#

In order to generate one or more schema templates, run ent init as follows:

go run entgo.io/ent/cmd/ent init User Pet

init は、ent/schema ディレクトリの下にスキーマ( user.gopet.go) の2つを作成します。 ent ディレクトリが存在しない場合は、ディレクトリも作成します。 通常はプロジェクトのルートディレクトリの下に ent ディレクトリを保持します。

アセットの生成#

フィールドエッジをいくつか追加した後、エンティティを操作するためのアセットを生成します。 プロジェクトのルートディレクトリから ent generate を実行するか、 を使用する go generate を使用してください:

go generate ./ent

generate コマンドは、スキーマの以下のアセットを生成します:

  • ClientTx オブジェクトはグラフとのやり取りに使用されます。
  • 各スキーマ型の CRUD ビルダー。 詳細は CRUD を参照してください。
  • 各スキーマタイプのエンティティオブジェクト (Go struct)。
  • ビルダーとの相互作用に使用される定数と述語を含むパッケージ。
  • A migrate package for SQL dialects. See Migration for more info.

Version Compatibility Between entc And ent#

When working with ent CLI in a project, you want to make sure the version being used by the CLI is identical to the ent version used by your project.

One of the options for achieving this is asking go generate to use the version mentioned in the go.mod file when running ent. If your project does not use Go modules, setup one as follows:

go mod init <project>

And then, re-run the following command in order to add ent to your go.mod file:

go get entgo.io/ent/cmd/ent

Add a generate.go file to your project under <project>/ent:

package ent
//go:generate go run -mod=mod entgo.io/ent/cmd/ent generate ./schema

Finally, you can run go generate ./ent from the root directory of your project in order to run ent code generation on your project schemas.

Code Generation Options#

For more info about codegen options, run ent generate -h:

generate go code for the schema directory
Usage:
ent generate [flags] path
Examples:
ent generate ./ent/schema
ent generate github.com/a8m/x
Flags:
--feature strings extend codegen with additional features
--header string override codegen header
-h, --help help for generate
--idtype [int string] type of the id field (default int)
--storage string storage driver to support in codegen (default "sql")
--target string target directory for codegen
--template strings external templates to execute

Storage Options#

ent can generate assets for both SQL and Gremlin dialect. The default dialect is SQL.

External Templates#

ent accepts external Go templates to execute. If the template name already defined by ent, it will override the existing one. Otherwise, it will write the execution output to a file with the same name as the template. フラグは以下のように filedir および glob の形式をサポートしています:

go run entgo.io/ent/cmd/ent generate --template <dir-path> --template glob="path/to/*.tmpl" ./ent/schema

詳しい情報と例は、 外部テンプレートドキュメント にあります。

entc をパッケージとして使用する#

ent CLI を実行する別のオプションは、次のようにパッケージとして使用することです。

package main
import (
"log"
"entgo.io/ent/entc"
"entgo.io/ent/entc/gen"
"entgo.io/ent/schema/field"
)
func main() {
err := entc.Generate("./schema", &gen.Config{
Header: "// Your Custom Header",
IDType: &field.TypeInfo{Type: field.TypeInt},
})
if err != nil {
log.Fatal("running ent codegen:", err)
}
}

完全な例は GitHub にあります。

スキーマの詳細#

グラフスキーマの説明を取得するには、以下を実行してください:

go run entgo.io/ent/cmd/ent describe ./ent/schema

An example for the output is as follows:

Pet:
+-------+---------+--------+----------+----------+---------+---------------+-----------+-----------------------+------------+
| Field | Type | Unique | Optional | Nillable | Default | UpdateDefault | Immutable | StructTag | Validators |
+-------+---------+--------+----------+----------+---------+---------------+-----------+-----------------------+------------+
| id | int | false | false | false | false | false | false | json:"id,omitempty" | 0 |
| name | string | false | false | false | false | false | false | json:"name,omitempty" | 0 |
+-------+---------+--------+----------+----------+---------+---------------+-----------+-----------------------+------------+
+-------+------+---------+---------+----------+--------+----------+
| Edge | Type | Inverse | BackRef | Relation | Unique | Optional |
+-------+------+---------+---------+----------+--------+----------+
| owner | User | true | pets | M2O | true | true |
+-------+------+---------+---------+----------+--------+----------+
User:
+-------+---------+--------+----------+----------+---------+---------------+-----------+-----------------------+------------+
| Field | Type | Unique | Optional | Nillable | Default | UpdateDefault | Immutable | StructTag | Validators |
+-------+---------+--------+----------+----------+---------+---------------+-----------+-----------------------+------------+
| id | int | false | false | false | false | false | false | json:"id,omitempty" | 0 |
| age | int | false | false | false | false | false | false | json:"age,omitempty" | 0 |
| name | string | false | false | false | false | false | false | json:"name,omitempty" | 0 |
+-------+---------+--------+----------+----------+---------+---------------+-----------+-----------------------+------------+
+------+------+---------+---------+----------+--------+----------+
| Edge | Type | Inverse | BackRef | Relation | Unique | Optional |
+------+------+---------+---------+----------+--------+----------+
| pets | Pet | false | | O2M | false | true |
+------+------+---------+---------+----------+--------+----------+

Code Generation Hooks#

entc パッケージは、コード生成フェーズにフック(ミドルウェア) のリストを追加するオプションを提供します。 このオプションは、スキーマにカスタムバリデータを追加したり、グラフ スキーマを使用して追加のアセットを生成したりするのに最適です。

// +build ignore
package main
import (
"fmt"
"log"
"reflect"
"entgo.io/ent/entc"
"entgo.io/ent/entc/gen"
)
func main() {
err := entc.Generate("./schema", &gen.Config{
Hooks: []gen.Hook{
EnsureStructTag("json"),
},
})
if err != nil {
log.Fatalf("running ent codegen: %v", err)
}
}
// EnsureStructTag ensures all fields in the graph have a specific tag name.
func EnsureStructTag(name string) gen.Hook {
return func(next gen.Generator) gen.Generator {
return gen.GenerateFunc(func(g *gen.Graph) error {
for _, node := range g.Nodes {
for _, field := range node.Fields {
tag := reflect.StructTag(field.StructTag)
if _, ok := tag.Lookup(name); !ok {
return fmt.Errorf("struct tag %q is missing for field %s.%s", name, node.Name, f.Name)
}
}
}
return next.Generate(g)
})
}
}

機能フラグ#

entc パッケージは、フラグを使って追加または削除されるコード生成機能のコレクションを提供します。

詳細については、 features-flags ページ をご覧ください。