在使用GORM + Postgres + Go Gin + Graphql创建之前自动生成UUID

问题描述

在将对象保存到go中的数据库中时,有什么方法可以用GORM自动生成UUID吗?

我有ROR迁移的经验,其中ID将自动生成,默认情况下为PK。

这是我的代码

Todo.go

package model

type Todo struct {
    ID     string `json:"id"`
    Text   string `json:"text"`
    Done   bool   `json:"done"`
}

schema.resolvers.go

func (r *mutationResolver) CreateTodo(ctx context.Context,input model.NewTodo) (*model.Todo,error) {
    db,_ := database.connect()
    defer db.Close()

    todo := &model.Todo{
        Text:   input.Text,ID:     fmt.Sprintf("%d",rand.Int()),// I don't want to provide ID like this
    }
    db.Create(&todo)
    ...
}

models_gen.go

# GraphQL schema example
#
# https://gqlgen.com/getting-started/

type Todo {
  id: ID!
  text: String!
  done: Boolean!
}

input NewTodo {
  text: String!
  userId: String!
}


type Mutation {
  createTodo(input: NewTodo!): Todo!
}

任何帮助将不胜感激。

解决方法

假设您正在使用gorm v2,则可以使用hooks来实现。有关钩子的文档为here

尤其是,您可以查看BeforeCreate挂钩。应用于model上,它为在数据库中创建函数之前要运行的函数提供了一个容器,以其名称状态表示。

GORM文档还提供了一个示例,当我们使用Gorm在数据库中创建用户实体时生成UUID,这似乎就是您要查找的内容:

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
  u.UUID = uuid.New()

  if !u.IsValid() {
    err = errors.New("can't save invalid data")
  }
  return
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...