2017-12-24 19 views
0

UINT8整数配列を有する単純なPostreSQL DBを取り返し:クエリは、常に[]

CREATE TABLE foo (
    id      serial PRIMARY KEY, 
    bar    integer[] 
); 

INSERT INTO foo VALUES(DEFAULT, '{1234567, 20, 30, 40}'); 

PQを使用して、これらの値は[] UINT8の配列として取得される何らかの理由であります。
documentationには、整数型がint64として返されると記載されています。これは配列にも当てはまりませんか?

db, err := sql.Open("postgres", "user=a_user password=your_pwd dbname=blah") 
if err != nil { 
    fmt.Println(err) 
} 

var ret []int 
err = db.QueryRow("SELECT bar FROM foo WHERE id=$1", 1).Scan(&ret) 
if err != nil { 
    fmt.Println(err) 
} 

fmt.Println(ret) 

出力:

sql: Scan error on column index 0: unsupported Scan, storing driver.Value type []uint8 into type *[]int64 
[] 
+0

はこのような何かを試してみてください。あなたのコードがエラーメッセージと一致していますか? – Flimzy

答えて

2

あなたはdriver.Valueとしてint型のスライスを使用することはできません。 Scanへの引数は、supported typesのうちの1つであるでなければならず、sql.Scannerインターフェイスを実装する必要があります。

[]uint8がエラーメッセージに表示される理由は、データベースから返された生の値が[]byteスライスであることです。[]uint8は同義語です。

[]byteスライスをカスタムPostgreSQLアレイタイプとして適切に解釈するには、Int64Arrayのようにpqパッケージに定義されている適切な配列タイプを使用する必要があります。あなたは[] int` `使用しているが、エラーが* [] int64``言う

var ret pq.Int64Array 
err = db.QueryRow("SELECT bar FROM foo WHERE id=$1", 1).Scan(&ret) 
if err != nil { 
    fmt.Println(err) 
} 

fmt.Println(ret) 
関連する問題