Golang + postgres storing gob data

5.2k views Asked by At

I'm trying to store encoded data using encoding/gob from Golang into Postgres. I'm using Gorm as well.

First, sending form data using

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

Currently client_encoding is set to UTF8 in the postgres database. Here's what I'm using to encode:

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

Then I store string(buf.Bytes()) which is stored in the database column which is currently a string type. Now I'm a novice with encoding, and I think gob just has a different encoding for my database. I'm receiving this error in console:

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

I've been following this gist for encryption/decryption: https://gist.github.com/fuzzyami/f3a7231037166117a6fef9607960aee7

From what I've read, I shouldn't be encoding structs into the db, in this case p, unless using gob. Correct me if I'm wrong with that (can't find the resource at the moment where I found this).

Is anyone able to point me in the right direction for storing this data in Postgres which is decrypted later? I'm clearly not understanding the encoding process, and not entirely sure where to start out here with reading resources, so any help is appreciated!

2

There are 2 answers

0
Greg Miller On

Took a look at https://golang.org/src/encoding/base64/example_test.go

Was able to use

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

Which successfully stored in the database.

3
hobbs On

Use a bytea column in postgresql to store a []byte, and skip the conversion to string.