使用go-graphql-client操作Hasura时UUID类型的删改异常问题
如何解决go-graphql-client操作Hasura GraphQL时删改操作的UUID类型不匹配问题?
我在Hasura中创建了user表,其schema如下:
id: UUID generated by gen_random_uuid() name: String email: String
使用go-graphql-client开发Go应用对接Hasura的GraphQL API时,创建和查询操作可以正常执行,但通过id(UUID字段)执行删除和更新操作时遇到报错:
Used string or int type but expected UUID type for id.
我尝试过用自定义UUID类型适配Hasura自动生成的GraphQL UUID,但问题依然存在。
已尝试的操作:
- 验证
delete_users_by_pk和update_users_by_pk的GraphQL突变结构 - 基于GraphQLUUID实现自定义UUID序列化/反序列化
- 确保UUID格式验证正确
- 查阅各类资源但未找到可行解决方案
代码片段:
func deleteUserHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) idStr := vars["id"] log.Printf("[DEBUG] Raw ID from URL: %s", idStr) // Parse and validate UUID parsedUUID, err := uuid.Parse(idStr) if err != nil { log.Printf("[ERROR] Invalid UUID: %v", err) http.Error(w, "Invalid UUID format", http.StatusBadRequest) return } log.Printf("[DEBUG] Parsed UUID: %s", parsedUUID) // Create GraphQL UUID gqlUUID := GraphQLUUID(parsedUUID.String()) log.Printf("[DEBUG] GraphQL UUID: %s", gqlUUID) // Build variables with type information variables := map[string]interface{}{ "id": gqlUUID, } log.Printf("[DEBUG] Mutation Variables: %+v", variables) // Execute mutation var mutation struct { DeleteUsersByPk struct { ID GraphQLUUID `graphql:"id"` } `graphql:"delete_users_by_pk(id: $id)"` } ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() err = client.Mutate(ctx, &mutation, variables) if err != nil { log.Printf("[ERROR] GraphQL Mutation Failed: %v", err) http.Error(w, "Error deleting user: "+err.Error(), http.StatusInternalServerError) return } log.Printf("[DEBUG] Mutation Response ID: %s", mutation.DeleteUsersByPk.ID) log.Printf("[SUCCESS] Deleted user with ID: %s", parsedUUID) w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(map[string]string{ "message": "User deleted successfully", "id": parsedUUID.String(), }) } // Update handler with similar debugging func updateUserHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) idStr := vars["id"] log.Printf("[DEBUG] Update Request ID: %s", idStr) parsedUUID, err := uuid.Parse(idStr) if err != nil { log.Printf("[ERROR] Invalid UUID: %v", err) http.Error(w, "Invalid UUID format", http.StatusBadRequest) return } var input struct { Name string `json:"name"` Email string `json:"email"` Age int `json:"age"` } if err := json.NewDecoder(r.Body).Decode(&input); err != nil { log.Printf("[ERROR] Request Body Decode: %v", err) http.Error(w, "Invalid request body", http.StatusBadRequest) return } log.Printf("[DEBUG] Update Data: %+v", input) var mutation struct { UpdateUsersByPk struct { ID GraphQLUUID `graphql:"id"` Name graphql.String `graphql:"name"` Email graphql.String `graphql:"email"` Age graphql.Int `graphql:"age"` } `graphql:"update_users_by_pk(pk_columns: {id: $id}, _set: {name: $name, email: $email, age: $age})"` } variables := map[string]interface{}{ "id": GraphQLUUID(parsedUUID.String()), "name": graphql.String(input.Name), "email": graphql.String(input.Email), "age": graphql.Int(input.Age), } log.Printf("[DEBUG] Mutation Variables: %+v", variables) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() err = client.Mutate(ctx, &mutation, variables) if err != nil { log.Printf("[ERROR] Update Mutation Failed: %v", err) http.Error(w, "Error updating user: "+err.Error(), http.StatusInternalServerError) return } log.Printf("[SUCCESS] Updated user ID: %s", parsedUUID) response := User{ ID: mutation.UpdateUsersByPk.ID, Name: string(mutation.UpdateUsersByPk.Name), Email: string(mutation.UpdateUsersByPk.Email), Age: int(mutation.UpdateUsersByPk.Age), } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(response) }
求助需求:
如何解决使用go-graphql-client操作Hasura GraphQL时,删改操作中的UUID类型不匹配问题?我怀疑问题出在自定义UUID类型上,但不确定如何解决。另外,直接在Hasura GraphQL playground或通过原生HTTP请求执行删改操作时均能正常工作。
内容的提问来源于stack exchange,提问作者Fa Re
相关产品推荐
相关产品推荐

