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

Feature Flags

このフレームワークはフラグを使って追加または削除することができるコード生成機能を提供しています。

使い方#

機能フラグは CLI のフラグまたは gen パッケージの引数として指定することができます。

CLI#

go run entgo.io/ent/cmd/ent generate --feature privacy,entql ./ent/schema

Go#

// +build ignore
package main
import (
"log"
"text/template"
"entgo.io/ent/entc"
"entgo.io/ent/entc/gen"
)
func main() {
err := entc.Generate("./schema", &gen.Config{
Features: []gen.Feature{
gen.FeaturePrivacy,
gen.FeatureEntQL,
},
Templates: []*gen.Template{
gen.MustParse(gen.NewTemplate("static").
Funcs(template.FuncMap{"title": strings.ToTitle}).
ParseFiles("template/static.tmpl")),
},
})
if err != nil {
log.Fatalf("running ent codegen: %v", err)
}
}

機能一覧#

プライバシーレイヤー#

プライバシーレイヤーを使うことでデータベースのエンティティのクエリーや変更のためのプライバシーポリシーを設定することができます。

--feature privacy フラグを指定することでこのオプションを有効にできます。より詳細なドキュメントは プライバシーページ を参照してください。

EntQL フィルタリング#

entql オプションを指定することで、異なるクエリビルダー向けに、ランタイムで汎用的かつ動的なフィルタ機能を使用することができます。

--feature entql フラグを指定することでこのオプションを有効にできます。より詳細な情報は プライバシーページ を参照してください。

マージコンフリクトの自動解決#

schema/snapshot オプションを指定することで、 entc (ent codegen) に対して内部パッケージに最新のスキーマのスナップショットを保存させることができます。これにより、ユーザーのスキーマがビルドできないときに自動的にマージコンフリクトを解決することができるようになります。

--feature schema/snapshot フラグを使用することでこのオプションを有効にできます。使用前に、このオプションに関しての背景を ent/ent/issues/852 で確認してください。

スキーマ設定#

sql/schemaaconfig オプションを使用すると、代わりの SQL データベース名をモデルに渡すことができます。 これは、モデルがすべて1つのデータベースの下にあるわけではなく、異なるスキーマに分散している場合に便利です。

--feature sql/schemaconfigフラグを利用することで、このオプションを有効にできます。 コード生成後は次のようにして新しいオプションを使うことができます:

c, err := ent.Open(dialect, conn, ent.AlternateSchema(ent.SchemaConfig{
User: "usersdb",
Car: "carsdb",
}))
c.User.Query().All(ctx) // SELECT * FROM `usersdb`.`users`
c.Car.Query().All(ctx) // SELECT * FROM `carsdb`.`cars`

行レベルでのロック#

sql/lock オプションを使用すると、行レベルのロックを設定できます。 SELECT ... FOR {UPDATE | SHARE} 構文を利用します。

--feature sql/lockフラグを使用することで、このオプションを有効にできます。

tx, err := client.Tx(ctx)
if err != nil {
log.Fatal(err)
}
tx.Pet.Query().
Where(pet.Name(name)).
ForUpdate().
Only(ctx)
tx.Pet.Query().
Where(pet.ID(id)).
ForShare(
sql.WithLockTables(pet.Table),
sql.WithLockAction(sql.NoWait),
).
Only(ctx)

カスタム SQL修飾子#

sql/modifier オプションを使用すると、ビルダーにカスタム SQL 修飾子を追加し、実行前にSQL文を変更できます。

--feature sql/modifierフラグを使用することで、このオプションを有効にできます。

Example 1

client.Pet.
Query().
Modify(func(s *sql.Selector) {
s.Select("SUM(LENGTH(name))")
}).
IntX(ctx)

上のコードは次のSQLクエリを生成します。

SELECT SUM(LENGTH(name)) FROM `pet`

例2

var p1 []struct {
ent.Pet
NameLength int `sql:"length"`
}
client.Pet.Query().
Order(ent.Asc(pet.FieldID)).
Modify(func(s *sql.Selector) {
s.AppendSelect("LENGTH(name)")
}).
ScanX(ctx, &p1)

上のコードは次のSQLクエリを生成します。

SELECT `pet`.*, LENGTH(name) FROM `pet` ORDER BY `pet`.`id` ASC

例3

var v []struct {
Count int `json:"count"`
Price int `json:"price"`
CreatedAt time.Time `json:"created_at"`
}
client.User.
Query().
Where(
user.CreatedAtGT(x),
user.CreatedAtLT(y),
).
Modify(func(s *sql.Selector) {
s.Select(
sql.As(sql.Count("*"), "count"),
sql.As(sql.Sum("price"), "price"),
sql.As("DATE(created_at)", "created_at"),
).
GroupBy("DATE(created_at)").
OrderBy(sql.Desc("DATE(created_at)"))
}).
ScanX(ctx, &v)

上のコードは次のSQLクエリを生成します。

SELECT
COUNT(*) AS `count`,
SUM(`price`) AS `price`,
DATE(created_at) AS `created_at`
FROM
`users`
WHERE
`created_at` > x AND `created_at` < y
GROUP BY
DATE(created_at)
ORDER BY
DATE(created_at) DESC

例4

var gs []struct {
ent.Group
UsersCount int `sql:"users_count"`
}
client.Group.Query().
Order(ent.Asc(group.FieldID)).
Modify(func(s *sql.Selector) {
t := sql.Table(group.UsersTable)
s.LeftJoin(t).
On(
s.C(group.FieldID),
t.C(group.UsersPrimaryKey[1]),
).
// "user_count" カラムをselectするカラムに追加します。
AppendSelect(
sql.As(sql.Count(t.C(group.UsersPrimaryKey[1])), "users_count"),
).
GroupBy(s.C(group.FieldID))
}).
ScanX(ctx, &gs)

上のコードは次のSQLクエリを生成します。

SELECT
`groups`.*,
COUNT(`t1`.`group_id`) AS `users_count`
FROM
`groups` LEFT JOIN `user_groups` AS `t1`
ON
`groups`.`id` = `t1`.`group_id`
GROUP BY
`groups`.`id`
ORDER BY
`groups`.`id` ASC

Upsert#

sql/upsert オプションを使用することで、SQLのON CONFLICT / ON DUPLICATE KEY 構文を使用した Upsert と Bulk Upsert を設定できます。 詳細については、Upsert APIを参照してください。

このオプションは --feature sql/upsert フラグを使用することでプロジェクトに追加することができます。

// 作成時に設定された新しい値を使用します。
id, err := client.User.
Create().
SetAge(30).
SetName("Ariel").
OnConflict().
UpdateNewValues().
ID(ctx)
// PostgreSQL では conflict_target が必要です。
err := client.User.
Create().
SetAge(30).
SetName("Ariel").
OnConflictColumns(user.FieldName).
UpdateNewValues().
Exec(ctx)
// Bulk upsert もサポートされています。
client.User.
CreateBulk(builders...).
OnConflict(
sql.ConflictWhere(...),
sql.UpdateWhere(...),
).
UpdateNewValues().
Exec(ctx)
// INSERT INTO "users" (...) VALUES ... ON CONFLICT WHERE ... DO UPDATE SET ... WHERE ...