You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:27:01