问题描述
在将对象保存到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
}