使用Hasura插入JSON数据的Golang实现指南

使用Hasura插入JSON数据的Golang实现指南 大家好。我有一个关于Hasura和Golang的问题。我手头有一些JSON类型的数据,想要通过Hasura将它们写入Yugabytedb。我需要用Golang代码来实现这个功能。Hasura提供了GraphQL API,我可以轻松地使用查询功能,但其他功能却成了问题。

有人能在这方面帮助我吗?

3 回复

好的。问题已经解决了。我原本想说的是其他函数是更新、删除和插入。

更多关于使用Hasura插入JSON数据的Golang实现指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


baris.akdas:

但是其他函数有问题

哪些?

在Golang中通过Hasura插入JSON数据到YugabyteDB,可以使用GraphQL mutation操作。以下是具体实现示例:

首先安装必要的依赖:

go get github.com/hasura/go-graphql-client

然后创建插入JSON数据的Golang代码:

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"
    "net/http"

    "github.com/hasura/go-graphql-client"
)

// 定义GraphQL mutation结构
type InsertDataMutation struct {
    InsertYourTable struct {
        Returning []struct {
            ID   int             `graphql:"id"`
            Data json.RawMessage `graphql:"data"` // JSON类型字段
        } `graphql:"returning"`
    } `graphql:"insert_your_table(objects: $objects)"`
}

func main() {
    // 初始化GraphQL客户端
    client := graphql.NewClient(
        "http://your-hasura-endpoint/v1/graphql",
        &http.Client{},
    ).WithAdminSecret("your-admin-secret")

    // 准备要插入的JSON数据
    jsonData := map[string]interface{}{
        "name": "example",
        "value": 123,
        "nested": map[string]string{
            "field": "nested_value",
        },
    }

    // 将Go结构体转换为JSON
    jsonBytes, err := json.Marshal(jsonData)
    if err != nil {
        log.Fatal(err)
    }

    // 定义mutation变量
    variables := map[string]interface{}{
        "objects": []map[string]interface{}{
            {
                "data": json.RawMessage(jsonBytes),
            },
        },
    }

    // 执行mutation
    var mutation InsertDataMutation
    err = client.Mutate(context.Background(), &mutation, variables)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("插入成功,返回ID: %d\n", mutation.InsertYourTable.Returning[0].ID)
}

如果需要批量插入,可以修改variables部分:

// 批量插入多个JSON对象
variables := map[string]interface{}{
    "objects": []map[string]interface{}{
        {
            "data": json.RawMessage(`{"name": "first", "value": 1}`),
        },
        {
            "data": json.RawMessage(`{"name": "second", "value": 2}`),
        },
    },
}

对于动态JSON数据,可以使用json.RawMessage类型处理:

func insertDynamicJSON(client *graphql.Client, rawJSON string) error {
    var mutation InsertDataMutation
    variables := map[string]interface{}{
        "objects": []map[string]interface{}{
            {
                "data": json.RawMessage(rawJSON),
            },
        },
    }
    
    return client.Mutate(context.Background(), &mutation, variables)
}

确保Hasura中对应的表已经定义了JSON或JSONB类型的字段,并且设置了适当的权限。

回到顶部