2017-10-12 1 views
0

golang에서 postgres IN 절을 사용하려고했지만 오류가 계속 발생했습니다. 이것은 실행하려는 쿼리입니다.golang의 postgres IN 절 사용

SELECT id1 FROM my_table WHERE type = (an int) AND id2 = (an int) AND id1 IN (list of UUIDs) 

이 코드를 사용하여이 쿼리를 구성했지만 다음 오류가 발생했습니다.

var params []interface{} 
inCondition := "" 
params = append(params, type) 
params = append(params, id2) 
for _, id := range id1 { 
    params = append(params, id) 
    if inCondition != "" { 
     inCondition += ", " 
    } 
    inCondition += "?" 
} 
query := fmt.Sprintf(`SELECT id1 FROM my_table WHERE type = ? AND id2 = ? AND id1 IN (%s)`, inCondition) 
rows, err := db.Query(query, params...) 

쿼리 내가 가진 :

SELECT id1 FROM my_table WHERE type = ? AND id2 = ? AND id1 IN (?, ?, ?) 

에 Params 출력 :

[]interface {}=[0 7545449 d323f8d5-ab97-46a3-a34e-95ceac2f3a6a d323f8d5-ab97-46a3-a34e-95ceac2f3a6b d323f8d5-ab97-46a3-a34e-95ceac2f3a6d] 

오류 :

pq: syntax error at or near \"AND\"" 

나는 무엇을 놓치고? 또는 이것을 어떻게 작동시킬 수 있습니까? id1은 길이가 가변 인 UUID 조각입니다.

+0

* 결코 건물 쿼리를위한 문자열 보간을 사용하지 마십시오. 최소한 신중하게 모든 것을 인용하지 않고. 이것은 거대한 SQL 주입 미끼입니다. 대신 바인드 매개 변수를 사용하십시오. 예 : https://godoc.org/github.com/lib/pq#Array –

+2

['lib/pq'] (https://github.com/lib/pq)를 사용하고 있습니까? 매개 변수의 자리 표시 자 대신'?'대신'$ 1, $ 2 ... '을 사용하십시오. – putu

+0

전체 결과 쿼리를 표시 할 수 있습니까? 데이터베이스 오류 로그에있을 수 있습니다. IN 쿼리에 특수 보간을 사용하십시오. –

답변

0

대신 $, $ 2 등을 자리 표시 자로 사용했습니다.

+0

예, Postgres는'? '자리 표시자를 허용하지 않습니다. 그러나 [sqlx] (https://github.com/jmoiron/sqlx)를 사용하면 모든 언어 (': entry_id'와 같은 명명 된 매개 변수뿐만 아니라)에서'?'를 사용할 수 있습니다. 그런 다음 다시 매핑하십시오 'Rebind() '를 통해 문제의 언어로 옮긴다. SQL 쿼리를 훨씬 덜 짜증나게 만드는 다른 기능이 많이 있습니다 (예 : 구조체로 직접 스캔하는 기능). – Kaedys