6

Test data:

CREATE TABLE test (id int, data text[])
INSERT INTO test(id, data) VALUES(1, '{a,b,c}')

Go Code. First - one that is working just fine:

func main() {
  db, _ := sqlx.Open("postgres", "user=postgres dbname=test sslmode=disable")
  var id int
  var asSlice []string
  err := db.QueryRowx(`SELECT id, data FROM test WHERE data @> ARRAY['b']`).Scan(&id, pq.Array(&asSlice))
  if err != nil {
    log.Fatal(err)
  }
  fmt.Println(id, asSlice)
}

I get 1 [a b c] as expected. But here I manually assign results to the variables

Now, to the part that is not working - using StructScan

type MyStruct struct {
    Id   int
    Data []string
}

func main() {
    db, _ := sqlx.Open("postgres", "user=postgres dbname=test sslmode=disable")
    var testStruct MyStruct
    err := db.QueryRowx(`SELECT id, data FROM test WHERE data @> ARRAY['b']`).StructScan(&testStruct)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(testStruct)
}

sql: Scan error on column index 1: unsupported Scan, storing driver.Value type []uint8 into type *[]string

I guess that means that sqlx does not know about PostgreSQL arrays and does not use pq.Array internally.

What should I do about it? Maybe I am doing something wrong? Or maybe I should apply pq.Array manually? If so - how?

1
  • @Melvin "expected struct but got slice". I'am querying only one row. So it is not it. Commented Jun 6, 2017 at 2:08

1 Answer 1

22

Try using pq.StringArray type for []string

type MyStruct struct {
    Id   int
    Data pq.StringArray
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.