跳到主要内容

注解

Schema 注解允许将元数据附加到字段和边等模式对象上,并将其注入到外部模板中。 注解必须是可序列化为 JSON 原始值的 Go 类型(例如结构体、映射或切片), 并实现 Annotation 接口。

内置注解允许配置不同的存储驱动程序(如 SQL)并控制代码生成输出。

自定义表名

可以使用 entsql 注解为类型提供自定义表名,如下所示:

ent/schema/user.go
package schema

import (
"entgo.io/ent"
"entgo.io/ent/dialect/entsql"
"entgo.io/ent/schema"
"entgo.io/ent/schema/field"
)

// User 持有 User 实体的模式定义。
type User struct {
ent.Schema
}

// User 的注解。
func (User) Annotations() []schema.Annotation {
return []schema.Annotation{
entsql.Annotation{Table: "Users"},
}
}

// User 的字段。
func (User) Fields() []ent.Field {
return []ent.Field{
field.Int("age"),
field.String("name"),
}
}

自定义表模式

使用 Atlas 迁移引擎,可以在多个数据库模式中定义和管理 Ent 模式。 查看更多信息,请参阅 多模式文档

外键配置

Ent 允许自定义外键创建,并为 ON DELETE 子句提供 引用操作

ent/schema/user.go
package schema

import (
"entgo.io/ent"
"entgo.io/ent/dialect/entsql"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
)

// User 持有 User 实体的模式定义。
type User struct {
ent.Schema
}

// User 的字段。
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("name").
Default("Unknown"),
}
}

// User 的边。
func (User) Edges() []ent.Edge {
return []ent.Edge{
edge.To("posts", Post.Type).
Annotations(entsql.OnDelete(entsql.Cascade)),
}
}

上面的示例将外键配置为级联删除父表中的行到子表中的匹配行。

数据库注释

默认情况下,表和列注释不存储在数据库中。但是,可以通过使用 WithComments(true) 注解来启用此功能。例如:

ent/schema/user.go
package schema

import (
"entgo.io/ent"
"entgo.io/ent/dialect/entsql"
"entgo.io/ent/schema"
"entgo.io/ent/schema/field"
)

// User 持有 User 实体的模式定义。
type User struct {
ent.Schema
}

// User 的注解。
func (User) Annotations() []schema.Annotation {
return []schema.Annotation{
// 将此注解添加到模式中可为表及其所有字段启用注释。
entsql.WithComments(true),
schema.Comment("同时出现在模式和生成代码中的注释"),
}
}

// User 的字段。
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("name").
Comment("用户名"),
field.Int("age").
Comment("用户年龄"),
field.String("skipped").
Comment("此注释不会存储在数据库中").
// 显式禁用此字段的注释。
Annotations(
entsql.WithComments(false),
),
}
}