如何使用 GORM 在后格雷SQL 中将包含转义代码的 JSON 插入到 JSONB 列中

我正在尝试将 JSON 字节存储到后greSQL,但有一个问题。


\u0000 无法转换为文本。


正如您在下面看到的,JSON包含诸如 之类的转义序列,似乎PostgreSQL将其解释为unicode字符,而不是JSON字符串。\u0000


err := raws.SaveRawData(data, url)

// if there is "\u0000" in the bytes

if err.Error() == "ERROR: unsupported Unicode escape sequence (SQLSTATE 22P05)" {

    // try to remove \u0000, but not work

    data = bytes.Trim(data, "\u0000")

    e := raws.SaveRawData(data, url) // save data again

    if e != nil {

        return e // return the same error

    }

    return nil

}

保存的结构是:


type RawJSONData struct {

    ID        uint64         `gorm:"primarykey" json:"id"`

    CreatedAt time.Time      `json:"-"`

    DeletedAt gorm.DeletedAt `json:"-" gorm:"index"`

    Data      datatypes.JSON `json:"data"`

    URL       string         `gorm:"index" json:"url"`

}

datatypes.JSON来自 gorm.io/datatypes。它似乎只是,它是(延伸自?)一个。json.RawMessage[]byte


我使用后greSQL的类型来存储这些数据。JSONB


桌子:


create table raw_json_data

(

    id         bigserial not null constraint raw_json_data_pke primary key,

    created_at timestamp with time zone,

    deleted_at timestamp with time zone,

    data       jsonb,

    url        text

);


HUH函数
浏览 150回答 1
1回答

慕沐林林

统一码转义序列在后记和列中根本不受支持:\u0000TEXTJSONBjsonb 类型也会拒绝 \u0000(因为这不能在 PostgreSQL 的文本类型中表示)您可以将列类型更改为:JSONcreate table Foo (test JSON);insert into Foo (test) values ('{"text": "明天再水\u0000绿塔的"}');-- worksjson 数据类型存储输入文本的精确副本这样做的好处是可以使数据与您从 API 接收的数据相同,以防转义序列具有需要保留的某些含义。它还允许您使用 Postgres JSON 运算符(例如 )进行查询,尽管将 JSON 字段转换为文本仍将失败:->>\u0000select test->>'text' from Foo-- ERROR:  unsupported Unicode escape sequence类型的列也接受任何字节序列,而无需操作数据。在戈尔姆,使用 标签:BYTEAtype:byteatype RawJSONData struct {    // ... other fields    Data      string `gorm:"type:bytea" json:"data"`}如果上述任何一项对您来说都不可接受,那么您必须清理输入字符串...
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go