Golang:在Postgres中插入嵌套结构模型

kjthegm6  于 2023-06-27  发布在  Go
关注(0)|答案(2)|浏览(117)

我有这个模型数据结构:

type Order struct {
    OrderEntry OrderEntry `db:"order"`
}

type OrderEntry struct {
    Order_uid          string
    Track_number       string
    Entry              string
    Delivery           Delivery
    Payment            Payment
    Items              []Item
    Locale             string
    Internal_signature string
    Customer_id        string
    Delivery_service   string
    Shardkey           string
    Sm_id              int64
    Date_created       string
    Oof_shard          string
}

type Delivery struct {
    ...
}

type Payment struct {
    ...
}

type Item struct {
    ...
}

我有table

CREATE TABLE "order"
(
    "order" jsonb NOT NULL
);

如何在这个psq表中插入Order对象?我使用sqlx和此代码即时通讯得到错误

func (r *RepositoryPostgres) CreateDocument(order L0.Order) error {
    tx := r.db.MustBegin()
    tx.MustExec("INSERT INTO order (order) VALUES ($1)", order.OrderEntry)
    err := tx.Commit()

    if err != nil {
        return err
    }

    return nil
}

panic:sql:converting argument $1 type:不支持的类型L0.OrderEntry,结构
如何正确解决这一问题?谢谢

lnlaulya

lnlaulya1#

INSERT语句的不受支持的类型“L0.OrderEntry”是导致您遇到问题的原因。“L0.OrderEntry”不能直接输入到JSONB列中,因为它是“L0.Order”中的嵌套结构。相反,在将OrderEntry对象输入到表中之前,必须将其封送到JSON表示形式中。

您可以按如下所示更改代码来解决此错误。

import "encoding/json"

    func (r *RepositoryPostgres) CreateDocument(order L0.Order) error {
    tx := r.db.MustBegin()

    orderJSON, error := json.Marshal(order.OrderEntry)
    if error != nil {
      return error
    }

    tx.MustExec("INSERT INTO order (order) VALUES ($1)", orderJSON)
    error = tx.Commit()

    if error != nil {
     return error
    }

     return nil
    }

order.OrderEntry对象在修改后的代码中使用“json.Marshal”方法编组为JSON。然后将生成的JSON字节切片(orderJSON)作为值提供给INSERT语句。

您可以通过将嵌套结构编组到JSON中来确保数据采用正确的格式插入到JSONB列中。

tzdcorbm

tzdcorbm2#

你需要做一些改变。
1.您需要将要存储的结构封送为JSON。您可以使用以下命令执行此操作:

orderB, err := json.Marshal(order.OrderEntry)
if err != nil {
    // handle err
}

tx.MustExec("INSERT INTO order (order) VALUES ($1)", orderB)

这将把你的结构体存储为表中的JSON字节数组。
1.为了正确地从结构体生成JSON,您需要向每个字段添加JSON结构体标记。例如:

type OrderEntry struct {
    Order_uid          string `json:"order_uid"`
    Track_number       string `json:"track_number"`
    Entry              string `json:"entry"`
    Delivery           Delivery `json:"delivery"`
    Payment            Payment `json:"payment"`
    Items              []Item `json:"items"`
    Locale             string `json:"locale"`
    Internal_signature string `json:"internal_signature"`
    Customer_id        string `json:"customer_id"`
    Delivery_service   string `json:"delivery_service"`
    Shardkey           string `json:"shard_key"`
    Sm_id              int64 `json:"sm_id"`
    Date_created       string `json:"date_created"`
    Oof_shard          string `json:"oof_shard"`
}

您可以按照自己的喜好来命名它们,snake-case是常见的格式。这些标记向解析器提供JSON字段的名称。
如果没有这些字段,您最终将得到空JSON,并且您将无法检索数据。

相关问题