注解

结构注解(Schema annotations) 允许附加元数据到结构对象(例如字段和边) 上面,并且将元数据注入到外部模板中。 注解是一种Go类型,它能进行JSON序列化(例如 struct, map 或 slice),并且需要实现Annotation接口。

内置注解能够配置不同的存储驱动(例如 SQL),控制代码生成输出。

自定义表名

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

  1. package schema
  2. import (
  3. "entgo.io/ent"
  4. "entgo.io/ent/dialect/entsql"
  5. "entgo.io/ent/schema"
  6. "entgo.io/ent/schema/field"
  7. )
  8. // User类型持有用户实体的结构(schema)定义
  9. type User struct {
  10. ent.Schema
  11. }
  12. // 用户实体的注解
  13. func (User) Annotations() []schema.Annotation {
  14. return []schema.Annotation{
  15. entsql.Annotation{Table: "Users"},
  16. }
  17. }
  18. // 用户实体的字段
  19. func (User) Fields() []ent.Field {
  20. return []ent.Field{
  21. field.Int("age"),
  22. field.String("name"),
  23. }
  24. }

外键配置

Ent允许对外键的创建进行定制,并且为ON DELETE子句提供referential action

  1. package schema
  2. import (
  3. "entgo.io/ent"
  4. "entgo.io/ent/dialect/entsql"
  5. "entgo.io/ent/schema/edge"
  6. "entgo.io/ent/schema/field"
  7. )
  8. // User类型持有用户实体的结构(schema)定义
  9. type User struct {
  10. ent.Schema
  11. }
  12. // 用户实体的字段
  13. func (User) Fields() []ent.Field {
  14. return []ent.Field{
  15. field.String("name").
  16. Default("Unknown"),
  17. }
  18. }
  19. // 用户实体的关系
  20. func (User) Edges() []ent.Edge {
  21. return []ent.Edge{
  22. edge.To("posts", Post.Type).
  23. Annotations(entsql.Annotation{
  24. OnDelete: entsql.Cascade,
  25. }),
  26. }
  27. }

上面的示例配置了外键,将父表的删除操作关联到子表,对子表中匹配的数据也进行删除。