注解
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),
),
}
}