2017-07-03 37 views
0

在調用*sql.Rows.Next()後可以重複使用相同的*sql.Rows,因此我可以將它傳遞給另一個函數?在Golang中重用或複製* sql.Rows

rows, err := db.Query(...) 
for rows.Next() { 
    // rows.Scan() 
} 
anotherFunction(rows) // NOT WORKING: This rows became empty. 

我試圖製作*sql.Rows的另一個副本,但它不起作用。

rows, err := db.Query(...) 
anotherRows := *rows 
// PANIC: call of load copies lock value: database/sql.Rows contains sync.RWMutex 
+1

當返回錯誤時,行將爲零,我猜,取消引用行數會導致崩潰。 – mattn

回答

0

database/sql包不給rewind行提供任何手段,您已經閱讀他們之後,即它是一個「只進」的結果集。

此外,它將保持與其內部的基礎(物理)數據庫連接的鏈接,因此將其複製或傳遞給它不是個好主意。

如果您需要將多個函數應用於您的數據,只需要Scan所有行,即可獲得一片數據對象,然後傳遞給它。

掃描會讓你讀出的數據的一個副本:

掃描副本從匹配的行的列到的值在由DEST指出。

這樣你就可以放心地CloseRows對象(釋放任何關聯的數據庫資源)。

在執行查詢(err)和讀取行後,通過rows.Err(),您也應該留意錯誤。