我現在采用如下所示的方法,利用gorm進行資料查詢,請問在使用limit()的前提下如何獲得所查資料的總行數?如 sql_calc_found_rows ?
webdb.Select(queryDBInfo.QueryInfos).Where(queryDBInfo.QueryCriteria).Order(queryDBInfo.SortCriteria).Offset(queryDBInfo.Offset).Limit(queryDBInfo.Count).Find(&find)
uj5u.com熱心網友回復:
可以這樣:db.Table(表名).Where(條件).Count(&totalSize).Sort(排序).Offset(offset).Limit(limit).Find(values)原理是先按條件count,再查詢分頁。親測,有效!
uj5u.com熱心網友回復:
不推薦這樣寫兩次查詢,有兩次出錯的可能,error要分開處理,不要偷懶
```go
var count int
if e:=db.Model(&model).Where("x >?", model.X).Count(&count).Error;e!=nil {
handle(e)
}
if count !=0 {
if e:=db.Model(&model).Where("x >?", model.X).Find(&models).Error;e!=nil {
handle(e)
}
}
uj5u.com熱心網友回復:
for exampletx := db.Where(xxx).Find(&data)
if tx.Error == nil {
tx = tx.Count(&count)
}
uj5u.com熱心網友回復:
先呼叫.count(&a) 然后limit().offset().Scan(&b)uj5u.com熱心網友回復:
樓上說的"兩次查詢,有兩次出錯的可能" 就要分開查? 不太懂 為什么要分開! 查count和查資料任何一個出錯出現error 都可以根據業務考慮是不是暫停流程,個人覺得沒道理一定要分開,除非是業務流程需要!
uj5u.com熱心網友回復:
因為gorm的find和count是分別發行sql的,你可以列印sql的log,會發行兩條sql,一條select *,一條select count(*)。因為是兩條sql,所以就有可能一條成功,一條失敗,或者兩條都失敗。如果第一條失敗了,就沒必要執行第二條了,所以分開做個判斷比較合理。uj5u.com熱心網友回復:
那我補充點,count的select后邊跟的是count(*),到底是不是或者什么情況是count(*)還是其他的,我不能確定;如果where條件正確的情況下,這句是不會出問題的,但是如果沒有分開,而select里寫的列是有可能出錯的,所以不一定會同時成功。
以上我還是覺得多余,如果這樣的問題都能過測驗,那談論這個有什么卵用?所以最終,我覺得合并在一起也是沒問題的。
uj5u.com熱心網友回復:
如果where條件正確的情況下,這句合在一起寫是不會出問題的
uj5u.com熱心網友回復:
那只能說你把用例想得太簡單了。發行兩條sql,就注定有時間差(哪怕多執行緒執行也一樣有時間差)。如果你主觀認定時間差不會影響,那大家還這么努力想辦法解決事務和并發問題干毛啊?uj5u.com熱心網友回復:
那只能說你把用例想得太簡單了。發行兩條sql,就注定有時間差(哪怕多執行緒執行也一樣有時間差)。如果你主觀認定時間差不會影響,那大家還這么努力想辦法解決事務和并發問題干毛啊? 因為gorm的find和count是分別發行sql的,你可以列印sql的log,會發行兩條sql,一條select *,一條select count(*)。因為是兩條sql,所以就有可能一條成功,一條失敗,或者兩條都失敗。如果第一條失敗了,就沒必要執行第二條了,所以分開做個判斷比較合理。
如果where條件正確的情況下,這句合在一起寫是不會出問題的
我前邊已經說了,業務需要拆開也沒問題。單純從陳述句上出發,我倒不認為我說的沒問題,不過你要延伸了說,如你說的并發情況下,那只能分兩次發的情況,怎么就可以保證第一次和第二次的結果就是一樣呢?難道select的還能加鎖?請指教一下,多謝!
uj5u.com熱心網友回復:
單純從陳述句出發也是有問題的。這里主要針對你where陳述句正確合在一起不會出問題的說法而延伸的。sql陳述句正確不代表sql就能正常執行,資料庫的狀態隨時在變化,你能百分百保證每次sql都成功?正因如此,才要在考慮程式的健壯性。兩條sql分別判斷,目的就是防止如果第一條失敗,就沒必要執行第二條了。按你的思路,如果第一條select失敗,第二條select count卻成功了(合在一起最終結果算成功),你是回傳結果還是不回傳?回傳結果就會造成總件數對了,而詳細一覽為空,這不是給程式帶來隱患bug嗎?如果業務需要的資料要完全保證一致,select加鎖又有何不可,鎖行甚至鎖表都可以,鎖的實作多了去了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10195.html
標籤:go語言
上一篇:netwox網路工具集 網路報文
