# 關于數據庫分頁查詢
在前面的章節中介紹了如下的鏈式調用方式來獲取查詢結果集的部分切片。
~~~
//例如以下例子,是取結果集的第1條到第50條記錄
results, err := engine.Sql(sql).Query().ListPage(1,50)
~~~
但這并不是數據庫分頁查詢,而是將查詢結果集獲取到本地取部分切片。
xorm也同樣支持數據庫分頁查詢,有如下四種方式:
* 方式一:orm方式數據庫分頁查詢
使用Limit函數進行數據庫分頁查詢,Limit(int, …int)限制獲取的數目,第一個參數為條數,第二個參數表示開始位置,如果不傳則為0
~~~
var log []Log
err = engine.Limit(5, 2).Find(&log)
~~~
* 方式二:執行原生sql語句方式數據庫分頁查詢
使用Sql,SqlMapClient,SqlTemplateClient函數執行原生sql語句進行數據庫分頁查詢。
~~~
results, err := engine.Sql("SELECT * FROM log LIMIT ? OFFSET ?", 5, 2).Query().List()
var log []Log
err := engine.Sql("SELECT * FROM log LIMIT ? OFFSET ?", 5, 2).Find(&log)
~~~
* 方式三:使用原生sql語句配合Limit函數或OrderBy函數方式進行數據庫分頁查詢
有時,我們需要跨表查詢多張表或者join多張表進行數據庫分頁查詢,而oracle和mssql數據庫分頁語句相對復雜和多樣,我們希望更關注業務邏輯,此時可以使用原生sql語句配合Limit函數或OrderBy函數方式進行數據庫分頁查詢。
對于oracle,postgresql,mysql等數據庫,可以使用原生sql語句配合Limit函數進行數據庫分頁查詢。注意,這些數據庫并不支持像mssql數據庫那樣使用原生sql語句配合Limit函數及OrderBy函數進行數據庫分頁查詢。
~~~
results, err := engine.Sql("SELECT * FROM log").Limit(5, 2).Query().List()
var ptlog []PtTimelineLog
err = engine.Sql("SELECT * FROM log").Limit(5, 2).Find(&ptlog)
~~~
對于postgresql,mysql數據庫生成的分頁查詢sql語句為
~~~
SELECT * FROM log LIMIT 5 OFFSET 2
~~~
在oracle數據庫中同樣也可以使用以上方式進行數據庫分頁查詢,舉例如下:
~~~
querySql := "QUERY_EQU_ALL_RFID" //sqlmap id
deviceCode:= "210601" //設備編號
pageNumber:=2 //第2頁
pageItemNumber:=10 //每頁顯示數量
first := (pageNumber - 1) * pageItemNumber
results, err := engine.SqlMapClient(querySql, deviceCode).Limit(pageItemNumber, first).Query().List()
~~~
sqlmap中配置的sql語句如下:
~~~
SELECT ID,EQU_ID,EQU_NAME,EQU_TYPE_CODE,EQU_TYPE_NAME,COMPONENT_CODE,COMPONENT_NAME,RFID,RFID_VERIFY,ISSUE_TIME,VERIFY_TIME,POS_X,POS_Y,ACCOUNT,ACCOUNT_NAME from VIEW_EQU_ALL_RFID where EQU_TYPE_CODE=?
~~~
oracle數據庫生成執行的分頁查詢SQL語句如下,其中xormdvCEQcJ97XQYsAcy36rehK是一個ROWNUM偽列,查詢返回結果集[]map[string]interface{}中將不會存在,如果使用Find函數返回結果集,定義的結構體中無需定義此字段
~~~
SELECT aat.* FROM (SELECT at.*,ROWNUM xormdvCEQcJ97XQYsAcy36rehK FROM (SELECT ID,EQU_ID,EQU_NAME,EQU_TYPE_CODE,EQU_TYPE_NAME,COMPONENT_CODE,COMPONENT_NAME,RFID,RFID_VERIFY,ISSUE_TIME,VERIFY_TIME,POS_X,POS_Y,ACCOUNT,ACCOUNT_NAME from VIEW_EQU_ALL_RFID where EQU_TYPE_CODE='210601') at WHERE ROWNUM <= 20) aat WHERE xormdvCEQcJ97XQYsAcy36rehK > 10
~~~
對于mssql數據庫,由于數據庫分頁語句的本身的特性,可以使用原生sql語句配合Limit函數及OrderBy函數進行數據庫分頁查詢。注意,在mssql數據庫中這種方式進行數據庫分頁查詢,Limit函數及OrderBy函數必須一起使用。
~~~
//示例1
results, err := engine.Sql("select t_tx_counts.id,t_tx_counts.count,t_tx_code.code from t_tx_code,t_tx_counts where t_tx_code.id=t_tx_counts.id and t_tx_code.id>?", 2).
OrderBy("count").Limit(5, 1).Query().List()
//示例2
var results []Result
err = engine.Sql("select t_tx_counts.id,t_tx_counts.count,t_tx_code.code from t_tx_code,t_tx_counts where t_tx_code.id=t_tx_counts.id and t_tx_code.id>?", 2).
OrderBy("id DESC").Limit(5, 0).Find(&results)
~~~
示例1生成的sql語句如下,其中xormv2rGnVAWh4qPT5Qntkt4PZ是一個ROW_NUMBER偽列,查詢返回結果集[]map[string]interface{}中將不會存在,如果使用Find函數返回結果集,定義的結構體中無需定義此字段
~~~
SELECT sq.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY count) AS xormv2rGnVAWh4qPT5Qntkt4PZ, T_TX_COUNTS.ID,T_TX_COUNTS.COUNT,T_TX_CODE.CODE FROM T_TX_CODE,T_TX_COUNTS WHERE T_TX_CODE.ID=T_TX_COUNTS.ID AND T_TX_CODE.ID>2) AS sq WHERE xormv2rGnVAWh4qPT5Qntkt4PZ BETWEEN 2 AND 6
~~~
示例2生成的sql語句如下
~~~
SELECT TOP 5 T_TX_COUNTS.ID,T_TX_COUNTS.COUNT,T_TX_CODE.CODE FROM T_TX_CODE,T_TX_COUNTS WHERE T_TX_CODE.ID=T_TX_COUNTS.ID AND T_TX_CODE.ID>2 ORDER BY id DESC
~~~
* 方式四:使用sql builder來構建sql語句進行數據庫分頁查詢。
sql builder相關內容請閱讀原版xorm提供了一個SQL Builder庫 [github.com/go-xorm/builder](https://github.com/go-xorm/builder)
- xorm
- 創建Orm引擎
- 定義表結構體
- 名稱映射規則
- 前綴映射,后綴映射和緩存映射
- 使用Table和Tag改變名稱映射
- Column屬性定義
- 表結構操作
- 獲取數據庫信息
- 表操作
- 創建索引和唯一索引
- 同步數據庫結構
- 導入導出SQL腳本
- SqlMap及SqlTemplate模板
- 初始化SqlMap配置文件及SqlTemplate模板
- SqlMap及SqlTemplate相關功能API
- SqlMap配置文件及SqlTemplate模板加密存儲及解析
- 手動管理SqlMap配置及SqlTemplate模板
- 插入數據
- ORM方式插入數據
- 執行SQL命令插入數據
- 創建時間Created
- 查詢和統計數據
- ORM方式查詢和統計數據
- 查詢條件方法
- 臨時開關方法
- Get方法
- Find方法
- Join的使用
- Iterate方法
- Count方法
- Rows方法
- Sum系列方法
- Exist方法
- 子查詢
- 執行SQL查詢
- 執行SQL查詢的11種常用方式
- 查詢返回json或xml字符串
- 鏈式查詢據操返回某條記錄的某個字段的值
- SqlTemplateClient執行過程
- 關于數據庫分頁查詢
- 更新數據
- ORM方式更新數據
- Update方法
- 樂觀鎖Version
- 更新時間Updated
- 執行SQL命令更新數據
- 刪除數據
- ORM方式刪除數據
- Delete方法
- 軟刪除Deleted
- 執行SQL命令刪除數據
- 事務處理
- 簡單事務模型
- 嵌套事務模型
- 八種事務類型及事務傳播機制
- 簡單事務相關API
- 嵌套事務相關API
- 嵌套事務示例代碼
- 主從數據庫(Master/Slave)讀寫分離
- 創建引擎組
- 負載策略
- 引擎組其他配置方法
- 數據庫讀寫分離
- 批量混合SQL操作
- SQL Builder
- 緩存
- 事件
- 數據導出
- Dump數據庫結構和數據
- 查詢結果集導出csv、tsv、xml、json、xlsx、yaml、html
- 多Sheet頁數據導出
- 日志
- 連接池
- xorm 工具
- 常見問題
- 感謝支持