我不知道为什么在entgo中无法使用edge generate。

huangapple go评论133阅读模式
英文:

I don't know why edge generate doesn't work in entgo

问题

我正在尝试使用Golang和Entgo构建应用程序,但在Entgo生成方面遇到了问题。

下面是用户表的代码:

  1. type User struct {
  2. ent.Schema
  3. }
  4. func (User) Fields() []ent.Field {
  5. return []ent.Field{
  6. field.String("nickname").NotEmpty().Unique(),
  7. field.String("user_type").Default("guest"),
  8. field.Time("created_at").Default(time.Now()),
  9. field.Time("updated_at").Default(time.Now()).UpdateDefault(time.Now()),
  10. }
  11. }
  12. func (User) Edges() []ent.Edge {
  13. return []ent.Edge{
  14. edge.To("token", Token.Type),
  15. }
  16. }

下面是关于令牌的代码:

  1. type Token struct {
  2. ent.Schema
  3. }
  4. func (Token) Fields() []ent.Field {
  5. return []ent.Field{
  6. field.String("token"),
  7. field.Int("user_id"),
  8. field.Time("created_at").Default(time.Now()),
  9. field.Time("updated_at").Default(time.Now()).UpdateDefault(time.Now()),
  10. }
  11. }
  12. func (Token) Edges() []ent.Edge {
  13. return []ent.Edge{
  14. edge.From("user", User.Type).Ref("users").Field("user_id"),
  15. }
  16. }

我尝试像这样生成Entgo:

  1. go generate ./ent

但是它没有起作用,并且给出了以下错误:

  1. entc/gen: resolve "Token" relations: edge "users" is missing for inverse edge: Token.user(User)
  2. exit status 1

我不知道出了什么问题,请帮忙解决。

英文:

i'm trying build app by golang and entgo and falling problem about entgo generate,

https://entgo.io/

below is user table code

  1. type user table
  2. // User holds the schema definition for the User entity.
  3. type User struct {
  4. ent.Schema
  5. }
  6. // Fields of the User.
  7. func (User) Fields() []ent.Field {
  8. return []ent.Field{
  9. field.String("nickname").NotEmpty().Unique(),
  10. field.String("user_type").Default("guest"),
  11. field.Time("created_at").Default(time.Now()),
  12. field.Time("updated_at").Default(time.Now()).UpdateDefault(time.Now()),
  13. }
  14. }
  15. // Edges of the User.
  16. func (User) Edges() []ent.Edge {
  17. return []ent.Edge{
  18. edge.To("token", Token.Type),
  19. }
  20. }

and below is about token

  1. // Token holds the schema definition for the Token entity.
  2. type Token struct {
  3. ent.Schema
  4. }
  5. // Fields of the Token.
  6. func (Token) Fields() []ent.Field {
  7. return []ent.Field{
  8. field.String("token"),
  9. field.Int("user_id"),
  10. field.Time("created_at").Default(time.Now()),
  11. field.Time("updated_at").Default(time.Now()).UpdateDefault(time.Now()),
  12. }
  13. }
  14. // Edges of the Token.
  15. func (Token) Edges() []ent.Edge {
  16. return []ent.Edge{
  17. edge.From("user", User.Type).Ref("users").Field("user_id"),
  18. }
  19. }

and im try generate entgo like this

  1. go generate ./ent

but it is not working and i give error like below,

  1. entc/gen: resolve "Token" relations: edge "users" is missing for inverse edge: Token.user(User)
  2. exit status 1

i dont know what

I don't know what's wrong, please help

答案1

得分: 0

你已经颠倒了edge.To和edge.From的顺序。

请参考文档中的说明:

使用edge.To构建器定义边的模式拥有该关系,而使用edge.From构建器仅为关系提供一个反向引用(具有不同的名称)。

从你的示例中看,你似乎想要实现一个一对多的关系,其中一个User可以关联多个Token

请将两个结构体上的Edges方法更改为:

  1. // User的边。
  2. func (User) Edges() []ent.Edge {
  3. return []ent.Edge{
  4. edge.From("token", Token.Type).
  5. Ref("users"),
  6. }
  7. }

  1. // Token的边。
  2. func (Token) Edges() []ent.Edge {
  3. return []ent.Edge{
  4. edge.To("users", User.Type).
  5. Unique().
  6. Field("user_id").
  7. Required(),
  8. }
  9. }
英文:

You've reversed the order of edge.To / edge.From.

See the ent docs:
> A schema that defines an edge using the edge.To builder owns the relation, unlike using the edge.From builder that gives only a back-reference for the relation (with a different name).

From your example it looks like you're trying to achieve a O2M relation where a User can have many Tokens associated.

Change the Edges methods on both structs to be:

  1. // Edges of the User.
  2. func (User) Edges() []ent.Edge {
  3. return []ent.Edge{
  4. edge.From("token", Token.Type).
  5. Ref("users"),
  6. }
  7. }

and

  1. // Edges of the Token.
  2. func (Token) Edges() []ent.Edge {
  3. return []ent.Edge{
  4. edge.To("users", User.Type).
  5. Unique().
  6. Field("user_id").
  7. Required(),
  8. }
  9. }

huangapple
  • 本文由 发表于 2022年8月3日 17:38:56
  • 转载请务必保留本文链接:https://go.coder-hub.com/73219476.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定