2017-01-09 26 views
0

does rows.Next轉到列表的末尾,不讓你回到開頭?我想運行一個查詢來檢查數據庫中是否有特定對象的數據。如果有這個對象,我想更新它。如果它不在那裏,我想插入一個新的行。所以我這樣做:golang sqldatabase rows.Next

rows, err := db.Query(query) 
    if err != nil { 
     Error.Printf("error querying: %v", err) 
    } 

    if !rows.Next() { 
     // insert new data 
    } 

它的作品就像我期望的那樣。但如果我這樣做,而不是在更多的邏輯的片斷的結尾:

rows, err := db.Query(query) 
    if err != nil { 
     Error.Printf("error querying: %v", err) 
    } 

    if !rows.Next() { 
     // insert new data 
    } 
    for rows.Next() { 
     fmt.Println("-----") 
     // do update 
    } 

我對rows.Next()永遠不會進入。如果我將for rows.Next()塊移動到if !rows.Next()塊之上,它的確可以正常工作。那麼當你調用Next()時會發生什麼,你必須再次從查詢中讀取?提前致謝。

+0

'rows.Next()'推進的結果集索引,如果它可以。如果成功則返回true,如果失敗則返回false(即沒有更多數據)。沒有辦法檢查是否有更多的數據沒有推進該索引,所以除了檢查是否有數據之外,第一次調用'rows.Next()'會推進該索引。如果你只返回一行,你的條件將是假的(有數據),但是你的循環不會發生(第一行之後沒有更多的數據,這是條件超前檢查)。 – Kaedys

回答

0

你可能想是這樣的:

rows, err := db.Query(query) 
if err != nil { 
    Error.Printf("error querying: %v", err) 
} 
shouldinsert := true 
for rows.Next() { 
    shouldinsert = false 
    fmt.Println("-----") 
    // do update 
} 
if shouldinsert { 
    // insert new data 
}