2013-04-23 3 views
2

Postgres 및 Mysql 용 데이터베이스/sql 패키지 및 드라이버를 사용하여 다음을 수행하고 싶습니다. 한 행을 선택하고 0 행, 하나의 행 또는 둘 이상의 행이 있음을 알고 싶습니다. QueryRow 함수는이를 확인하지 못합니다. 한 가지 이상의 행이 있는지에 관계없이 오류없이 한 행을 반환 할 것이기 때문입니다. 내 상황에서는 둘 이상의 행에 오류가있을 수 있으며이를 알고 싶습니다. 나는 이것을하기위한 일반적인 함수를 만들고 싶다.

쿼리 함수를 사용하는 함수를 만드는 방법을 살펴 봤지만 두 개 이상의 행이있는 경우 첫 번째 행을 반환하는 방법을 알지 못합니다. 두 개 이상의 행이 있다는 사실을 반환하고 싶지만 첫 번째 행을 반환하고 싶습니다. 두 개 이상의 행이 있는지 확인하려면 다음을 수행해야하며 첫 번째 행을 덮어 씁니다. 분명히 일반적인 기능을 만들지 않고이 작업을 수행 할 수 있지만 많은 작업을 수행해야하기 때문에 기능을 원합니다.

누군가이 작업을 수행하는 방법을 설명해 주시겠습니까? IE. 성공한 다음 작업이 완료되거나 다음 작업이 아무 것도 반환하지 않을 때 함수에서 첫 번째 행을 반환합니다.Sql Select - 반환 된 총 행

답변

1

저는이를 달성하기 위해 database/sql & MySQLDriver 두 가지 모두를 사용하고 있습니다. 을 https://github.com/go-sql-driver/에 다운로드 할 수 있습니다.

나는 데이터베이스에서 하나 이상의 행을 가져 오기 위해 execQuery 함수를 직접 작성했습니다. 그것은 MySQL을 기반으로하지만 비슷한 구현으로 Postgres에도 사용할 수 있다고 생각합니다.

test이라는 DB 테이블이 있고 id, name, age이라는 행이 있다고 가정합니다.

코드 :

var db *sql.DB // it should be initialized by "sql.Open()" 

func execQuery(SQL string, args ...interface{}) (rows *sql.Rows, is_succeed bool) { 
    rows, err := db.Query(SQL, args...) 
    var ret bool 
    if err == nil && rows != nil { // if DB query error rows will be nil, it will return false 
    ret = true 
    } else { 
    ret = false 
    } 

    return rows, ret 
} 

사용법 :

var name, age string 
rows, is_succeed = execQuery("SELECT `name`, `age` FROM `test` WHERE `id` = ?", "123") 
if !is_succeed { 
    // error 
    return 
} 
for rows.Next() { // if have zero result rows, this for route won't execute 
    err := rows.Scan(&name, &age) 
    // check if has error & do something 
} 

하기이를 달성 할 수있는 SQL을 사용하여, 단지 for 경로에 카운터를 추가, 많은 행이 반환 방법을 알고 싶다면

.

sql.Rows은 목록 구조가 좋기 때문에 반환 된 행의 첫 번째 행에 rows *sql.Rows 점이 있습니다. rows.Next()을 사용하여 모든 행을 탐색하십시오. 그게 네가 물어 본 것 같아.

당신이 정말로 행을 알고 싶다면

memcacheDB 또는 Redis가 아니면 그냥 자신이 문제를 해결하는 데 도움이 할 수있는 간단한 카운터를 구현 같은 캐시 정비사를 사용하여 매우 자주 을 계산합니다.

+0

답변 해 주셔서 감사합니다. 달성하고자하는 것은 본질적으로 얼마나 많은 행이 반환되는지를 아는 것입니다. MySQL은 그것을 달성하는 방법을 가지고 있지만 Postgres는 그렇지 않습니다. 두 번째 선택은 둘 이상의 행이 있는지를 확인하는 것입니다. 두 번째 행이있는 경우 첫 번째 행은 추측 된 두 번째 행에 대해 "덮어 쓰기"됩니다. 요약하면, 내가 알고 싶은 것은 다음과 같은 것이다. 하나의 행이 있습니까?, b. 행이 두 개 이상 있습니까? 기음. 나는 상관없이 첫 번째 행 싶어요. 디. 이상적으로, 나는 행의 수를 알고 싶습니다만, Nexts를 비효율적으로 반복한다고 생각합니다. –

+0

메모리에서 목록 구조를 탐색하는 것이 SQL 쿼리보다 훨씬 효율적입니다. 또한 복잡한 솔루션보다 훨씬 쉬운 몇 줄의 코드로 모든 질문에 대한 답을 찾을 수 있습니다. 그러나'rows.Next()'를 사용하면 데이터베이스/sql이 제공하는 유일한 솔루션 인 것처럼 보이거나 캐시 메카닉을 사용합니다. –

관련 문제