2017-12-30 6 views
1

쿼리의 일부로 string을 사용하고 싶습니다.Golang 쿼리의 일부로 쿼리 문자열

func GetAll(id int) { 
    var queryPart string 
    if id != 0 { 
    queryPart = fmt.Sprintf("WHERE id = %d", id) 
    } else { 
    queryPart = "" 
    } 


    database.DB.Query("SELECT name FROM table ?, queryPart) 
} 

있음 * db.sql 인스턴스가 있습니다.

어떻게 작동합니까? 이 코드를 사용하면 "SQL 구문에 오류가 있습니다"라는 메시지가 표시됩니다.

답변

4

쿼리를 점진적으로 만들 수 있으며 필요한 경우 인수 만 추가 할 수 있습니다. 이를 많이하고있는 자신을 발견 할 경우

// Build a query (columns and table being strings) 
q := fmt.Sprintf("SELECT %s FROM %s", columns, table) 
args := []interface{}{} 

// Add conditional query/args 
if id != 0 { 
q = fmt.Sprintf("%s WHERE id=?",q) 
args = append(args,id)  
} 

// Perform the query 
database.DB.Query(q,args...) 

, 당신은 쉽게 너무 소란하지 않고 SQL 쿼리를 작성하게됩니다 작은 쿼리 빌더를 작성하는 것이 좋습니다. select, join 등을위한 슬롯과 args를위한 배열로 상대적으로 간단 할 수 있습니다.

+0

@mkopriva 편집 해 주셔서 감사합니다. 동시에 편집 중이 었으며 생각이 충돌했습니다. –

+0

나는 그것을 보았다, 걱정하지 않는다;) – mkopriva

+0

당신이 당신의 단순한 쿼리 빌더의 몇 가지 예제를 가지고 있다면, 완벽하게보고 싶다. :) – nexequ

1

자리 표시 자 (?)는 문 전용이 아닌 변수 전용입니다. 또한

if id != 0 { 
    database.DB.Query("SELECT name FROM table WHERE id = ?", id) 
    } else { 
    database.DB.Query("SELECT name FROM table") 
    } 

: Sprintf("WHERE id = %d", id) 패배 자리의 목적을 사용하여

대신 두 개의 쿼리를해야한다.

+0

유일한 방법입니까? 나는 복잡한 쿼리를 가지고 있고 코드를 복제하고 싶지 않습니다. – nexequ

+0

@nexequ 쿼리 문자열을'+'로 연결하고'append'를 사용하여 인수를 슬라이스로 수집 한 다음 끝에 'Query (queryString, args ...)'와 같이 쿼리를 실행할 수 있습니다. – mkopriva

관련 문제