2014-10-30 90 views
0

簽名是func (db *DB) Query(query string, args ...interface{}) (*Rows, error)Go func(* DB)當這樣的行不存在時查詢返回

什麼去回報func (*DB) Query如果查詢和調用:

rows, err := db.Query("SELECT username FROM userstable WHERE username=$1", registerInstance.Username) 

時,有沒有這樣的行中的表userstable

它是否返回非零error或返回空字符串值爲Result並且非零error僅在發生錯誤時返回?

+1

這很容易通過嘗試查詢,同時調試來解決。它應該返回一組空行。 – Momer 2014-10-30 21:50:40

+0

謝謝,你是對的。 – 2014-10-30 23:09:31

+0

但這是一個有效的問題。它指出了錯誤返回和空行情況的區別。實際上,這已經被@dave的回答所揭示。在文檔中回答有線索並不會使問題失效,但回答者的答案未包含在他提供的文檔鏈接中。 – 2014-10-30 23:27:01

回答

1

在這種情況下,您一定要使用QueryRow而不是Query(假設您只有一個用戶擁有相同的用戶名)。

http://go-database-sql.org/retrieving.html

轉到定義了一個特殊誤差恆定,稱爲sql.ErrNoRows,這是從QueryRow()返回時,結果是空的。在大多數情況下,這需要作爲特殊情況來處理。一個空的結果通常不會被應用程序代碼視爲錯誤,如果您不檢查錯誤是否爲特殊常量,則會導致應用程序代碼錯誤,但您並不期望。

使用Query,你會遍歷結果的東西,如:

rows, err := db.Query("SELECT username FROM userstable WHERE username=$1", registerInstance.Username) 
if err != nil { 
    log.Fatal(err) 
} 
defer rows.Close() 
var users []User 
for rows.Next() { 
    user = User{} 
    err := rows.Scan(&user.Username) 
    if err != nil { 
     log.Fatal(err) 
    } 
    users = append(users, user) 
} 
rows.Close() 
if (len(users) == 0) { 
    //handle this case 
} 
+0

我試圖編輯'users:= append(users,user)'行到'users = append(users,user)'。但改變必須有6分鐘的字符。所以我刪除了保存並重新編輯的行,但最後一次無法保存更改。 Noe它似乎沒問題。更改已生效。 – 2014-10-31 15:49:31

+0

沒問題,很好,編輯 – dave 2014-10-31 15:50:32