【问题标题】:Golang + postgres storing gob dataGolang + postgres 存储 gob 数据
【发布时间】:2019-04-14 13:10:25
【问题描述】:

我正在尝试使用 encoding/gob 从 Golang 将编码数据存储到 Postgres 中。我也在使用 Gorm。

首先,使用发送表单数据

if err := json.NewDecoder(r.Body).Decode(model); err != nil {
  http.Error(w, err.Error(), http.StatusBadRequest)
  return
}

目前client_encoding 在 postgres 数据库中设置为 UTF8。这是我用来编码的内容:

type payload struct {
    Key     []byte
    Nonce   *[nonceLength]byte
    Message []byte
}

// Encrypt message
p.Message = secretbox.Seal(p.Message, plaintext, p.Nonce, key) // key set prior to this

buf := &bytes.Buffer{}
if err := gob.NewEncoder(buf).Encode(p); err != nil {
    return nil, err
}

return buf.Bytes(), nil

然后我存储string(buf.Bytes()),它存储在当前是字符串类型的数据库列中。现在我是编码新手,我认为 gob 对我的数据库有不同的编码。我在控制台中收到此错误:

(pq: invalid byte sequence for encoding "UTF8": 0xff)

我一直在关注加密/解密的要点: https://gist.github.com/fuzzyami/f3a7231037166117a6fef9607960aee7

根据我的阅读,我不应该将结构编码到数据库中,在这种情况下为p,除非使用gob。如果我错了,请纠正我(在我找到这个的那一刻找不到资源)。

有没有人能指出我在 Postgres 中存储这些数据的正确方向,这些数据稍后会被解密?我显然不了解编码过程,也不完全确定从哪里开始阅读资源,因此不胜感激!

【问题讨论】:

    标签: postgresql go gob


    【解决方案1】:

    在 postgresql 中使用bytea 列存储[]byte,并跳过转换为string

    【讨论】:

    • 我刚刚尝试实现这一点,但是在将主体编码到结构中时,我得到json: cannot unmarshal string into Go struct field Table.Column of type pq.ByteaArray。关于解决这个问题的任何想法?看起来这可能会有点混乱。
    • 那是来自不在你问题中的代码,你做错了什么。
    • 只是传递表单数据并解码到结构中。我现在会更新问题。
    【解决方案2】:

    看了https://golang.org/src/encoding/base64/example_test.go

    可以使用

    return base64.StdEncoding.EncodeToString(buf.Bytes()), nil
    

    成功存入数据库。

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 2021-05-05
      • 2022-01-18
      • 2016-11-07
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      相关资源
      最近更新 更多