2017-12-24 11 views
0

은 정수 배열로 간단한 PostreSQL의 DB를 가지고 UINT8 : PQ를 사용쿼리는 항상 [] 반환

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

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

는,이 값은 어떤 이유로 배열 [] 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

는'[] int'하지만 오류가 * [] int64''말한다. 코드가 오류 메시지와 일치합니까? – Flimzy

답변

2

당신은 driver.Value로 INT의 조각을 사용할 수 없습니다. Scan에 대한 인수는 supported types 중 하나임이어야하며 sql.Scanner 인터페이스를 구현해야합니다.

[]uint8이 오류 메시지에 표시되는 이유는 데이터베이스에서 반환 된 원시 값이 []byte 슬라이스이며 []uint8은 동의어입니다.

[]byte 슬라이스를 사용자 정의 PostgreSQL 배열 유형으로 적절히 해석하려면 Int64Array과 같이 pq 패키지에 정의 된 적절한 배열 유형을 사용해야합니다. 이 같은

시도 뭔가 : 당신이 사용하고있는

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)