2013-04-23 68 views
2

使用Postgres和Mysql的數據庫/ sql包和驅動程序我希望實現以下目標。我希望能夠選擇一行,並知道有零行,一行或多行。 QueryRow函數沒有達到這個目的,因爲據我所知,無論是否有多行,它都會返回一行而不會出錯。對於我的情況,不止一行可能是錯誤的,我想知道它。我想創建一個通用函數來執行此操作。

我看着創建一個使用查詢函數的函數,但我不知道如何返回第一行,如果有多個行。我想返回有多行的事實,但我也想返回第一行。要確定有多行,我必須執行Next,並覆蓋第一行。很顯然,我可以在不創建通用功能的情況下實現此功能,但是我想要一個功能來實現這一功能,因爲我需要在多個位置執行此操作。

有人請向我解釋如何實現此目的。 IE瀏覽器。當一個成功的Next完成或Next沒有返回任何東西時,從函數返回第一行。Sql Select - 返回的總行數

回答

1

我正在使用database/sql & MySQLDriver來實現此目的。您可以在https://github.com/go-sql-driver/下載MySQLDriver

我自己寫了execQuery函數來從數據庫中獲取一行或多行。它基於MySQL,但我認爲它也可以用於具有類似工具的Postgres。

假設您有一個名爲test的數據庫表,並且具有名爲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 
} 

如果你想知道多少行怎麼回來了,只是在for路線添加計數器,可以使用SQL也可以做到這一點。

sql.Rows喜歡列表結構,rows *sql.Rows返回第一行的點。使用rows.Next()來遍歷每一行。我想這就是你問的。

如果你真的想知道行數非常時候,使用緩存技工像memcacheDBRedis或只是實現一個簡單的計數器自己可以幫你解決這個問題。

+0

感謝您的回答。我想要實現的基本上是知道有多少行返回。 MySql有一種實現方式(它不適用於我),但是Postgres顯然沒有。我的第二選擇是知道是否有多行。如果還有第二行,則第一行將被「下一個」覆蓋,我猜測第二行。總之,我想知道的是以下所有內容。是否有一排?b。是否有多行? C。我不管第一排。 d。理想情況下,我想知道行數,但我認爲重複Nexts效率低下。 – 2013-04-24 05:15:04

+0

在內存中執行列表結構遍歷比SQL查詢更有效。您還可以通過幾行代碼找到所有問題的答案,這比更復雜的解決方案要容易得多。但是,使用'rows.Next()'似乎是'database/sql'現在提供的唯一解決方案,或者使用緩存機制。 – 2013-04-24 05:44:41