# 批量混合SQL操作
### 批量混合SQL操作API
在了解批量混合SQL操作API前,請先了解一下Sql執行單元的定義
### Sql執行單元定義
* 當sqls為string時候,則Sql執行單元為該字符串的內容
* 當sqlkeys為string時,則Sql執行單元為所對應的SqlMap配置項或SqlTemplate模板
* 當sqls為[]string或map[string]string時候,則Sql執行單元為相關元素的字符串內容
* 當sqlkeys為[]string或map[string]string時候,則Sql執行單元為以相關元素為key所對應的SqlMap配置項或SqlTemplate模板
* Sql執行單元的具體內容,必須以"select", "insert", "delete", "update", "create", "drop"為起始內容,但后續內容不會繼續做檢查,請合理定義Sql執行單元內容。當執行單元內容不是以上起始內容,則對應索引或key返回的結果集為nil,請注意對返回結果集的nil判斷
* Sql執行單元并非單條Sql語句,當執行insert,delete,update,create,drop操作時候,可以為多條Sql語句,這里需要對應的數據庫的SQL語法支持。如在一個執行單元批量執行多條Sql,返回結果集作為一組所有執行單元的大結果集中的一個元素,這個結果集的數據類型為map[string]interface{},只有2個鍵值對,一個鍵值對的key為LastInsertId,一個鍵值對的key為RowsAffected,請控制好執行粒度。另外,目前不是所有數據庫都支持返回LastInsertId,目前還在設計更通用的API來實現所有數據庫都能支持此功能。
* 當執行select操作時候,執行單元的Sql語句必須為一條,返回結果集作為一組所有執行單元的大結果集中的一個元素
* insert,delete,update,create,drop操作不能和select操作混合定義在同一個執行單元中
* 最后,Sql執行單元基于以上約定,請合理組織
### Sqls(sqls, parmas...)方法說明:
1. sqls參數
* sqls參數數據類型為interface{}類型,但實際參數類型檢查時,只支持string,[]string和map[string]string三中類型,使用其他類型均會返回參數類型錯誤。
* 使用string類型則為執行單條Sql執行單元(傳送門:[Sql執行單元定義](#SQL)),Execute()方法返回的結果集數據類型為[][]map[string]interface{},只有1個元素。
* 使用[]string則Execute()方法為有序執行多條Sql執行單元,Execute()方法返回的結果集數據類型為[][]map[string]interface{}類型,結果集元素個數與sqls參數的元素個數相同,每個元素索引與返回結果集的索引一一對應。
* 使用map[string]string類型則Execute()方法為無序執行多條Sql執行單元,Execute()方法返回的結果集數據類型為map[string][]map[string]interface{},結果集map的key與返回結果集的key一一對應。
2. parmas...參數
* 可以接收0個參數或則1個參數,當所有執行單元都無需執行參數時候,可以不傳此參數
* parmas參數數據類型為interface{},但實際參數類型檢查時,只支持map[string]interface{},[]map[string]interface{}和map[string]map[string]interface{}三種類型,使用其他類型均會返回參數類型錯誤。
* 使用map[string]interface{}類型時候,sqls參數類型必須為string類型,即map[string]interface{}類型為單條Sql執行單元的參數。
* 使用[]map[string]interface{}類型時候,sqls參數類型可以為string類型,此時只有第一個元素[0]map[string]interface{}會被提取,之后的元素將不起任何作用。同時,sqls參數類型也可以為[]string類型,這種參數組合是最常用的組合形式之一,sqls參數的索引和parmas參數的索引一一對應。當某個索引所對應的Sql執行單元是無參數的時候,請將此索引的值設為nil,即parmas[i] = nil
* 使用map[string]map[string]interface{}類型時,sqls參數類型必須為map[string]string類型,這種參數組合是最常用的組合形式之一,sqls參數的key和parmas參數的key一一對應。當某個key所對應的Sql執行單元是無參數的時候,請將此key的值設為nil,即parmas[key] = nil
### SqlMapsClient(sqlkeys, parmas...)方法說明:
1. sqlkeys參數
* sqlkeys參數數據類型為interface{}類型,但實際參數類型檢查時,只支持string,[]string和map[string]string三中類型,使用其他類型均會返回參數類型錯誤。
* 使用string類型則為執行單條Sql執行單元(Sql執行單元定義),即在xorm種緩存的SqlMap中的key所對應的配置項,Execute()方法返回的結果集數據類型為[][]map[string]interface{},只有1個元素。
* 使用[]string則Execute()方法為有序執行多條Sql執行單元,Execute()方法返回的結果集數據類型為[][]map[string]interface{}類型,結果集元素個數與sqls參數的元素個數相同,sqlkeys的索引與返回結果集的索引一一對應,sqlkeys存儲的是每個元素的值是xorm緩存的SqlMap的key
* 使用map[string]string類型則Execute()方法為無序執行多條Sql執行單元,Execute()方法返回的結果集數據類型為map[string][]map[string]interface{},sqlkeys的key與返回結果集的key一一對應,sqlkeys存儲的是每個鍵值對的值是xorm緩存的SqlMap的key
2. parmas...參數
* 可以接收0個參數或則1個參數,當所有執行單元都無需執行參數時候,可以不傳此參數
* parmas參數數據類型為interface{},但實際參數類型檢查時,只支持map[string]interface{},[]map[string]interface{}和map[string]map[string]interface{}三種類型,使用其他類型均會返回參數類型錯誤。
* 使用map[string]interface{}類型時候,sqlkeys參數類型必須為string類型,即map[string]interface{}類型為單條Sql執行單元的參數。效果等同SqlMapClient()方法(請注意本方法名為SqlMapsClient)。
* 使用[]map[string]interface{}類型時候,sqlkeys參數類型支持兩種:
* 第1種為string類型,此時只有第一個元素[0]map[string]interface{}會被提取,之后的元素將不起任何作用。
* 第2種為[]string類型,這種參數組合是最常用的組合形式之一,sqlkeys參數的索引和parmas參數的索引一一對應。當某個索引所對應的Sql執行單元是無參數的時候,請將此索引的值設為nil,即parmas[i] = nil
* 使用map[string]map[string]interface{}類型時,sqlkeys參數類型必須為map[string]string類型,這種參數組合是最常用的組合形式之一,sqlkeys參數的key和parmas參數的key一一對應。當某個key所對應的Sql執行單元是無參數的時候,請將此key的值設為nil,即parmas[key] = nil
### SqlTemplatesClient(sqlkeys, parmas...)方法說明:
1. sqlkeys參數
* sqlkeys參數數據類型為interface{}類型,但實際參數類型檢查時,只支持string,[]string和map[string]string三中類型,使用其他類型均會返回參數類型錯誤。
* 使用string類型則為執行單條Sql執行單元(Sql執行單元定義),即在xorm緩存的SqlTemplate中的key所對應的模板,Execute()方法返回的結果集數據類型為[][]map[string]interface{},只有1個元素。
* 使用[]string則Execute()方法為有序執行多條Sql執行單元,Execute()方法返回的結果集數據類型為[][]map[string]interface{}類型,結果集元素個數與sqls參數的元素個數相同,sqlkeys的索引與返回結果集的索引一一對應,sqlkeys存儲的是每個元素的值是xorm緩存的SqlTemplate的key
* 使用map[string]string類型則Execute()方法為無序執行多條Sql執行單元,Execute()方法返回的結果集數據類型為map[string][]map[string]interface{},sqlkeys的key與返回結果集的key一一對應,sqlkeys存儲的是每個鍵值對的值是xorm緩存的SqlTemplate的key
2. parmas...參數
* 可以接收0個參數或則1個參數,當所有執行單元都無需執行參數時候,可以不傳此參數
* parmas參數數據類型為interface{},但實際參數類型檢查時,只支持map[string]interface{},[]map[string]interface{}和map[string]map[string]interface{}三種類型,使用其他類型均會返回參數類型錯誤。
* 使用map[string]interface{}類型時候,sqlkeys參數類型必須為string類型,即map[string]interface{}類型為單條Sql執行單元的參數。效果等同SqlMapClient()方法(請注意本方法名為SqlMapsClient)。
* 使用[]map[string]interface{}類型時候,sqlkeys參數類型支持兩種:
* 第1種為string類型,此時只有第一個元素[0]map[string]interface{}會被提取,之后的元素將不起任何作用;
* 第2種為[]string類型,這種參數組合是最常用的組合形式之一,sqlkeys參數的索引和parmas參數的索引一一對應。當某個索引所對應的Sql執行單元是無參數的時候,請將此索引的值設為nil,即parmas[i] = nil
* 使用map[string]map[string]interface{}類型時,sqlkeys參數類型必須為map[string]string類型,這種參數組合是最常用的組合形式之一,sqlkeys參數的key和parmas參數的key一一對應。當某個key所對應的Sql執行單元是無參數的時候,請將此key的值設為nil,即parmas[key] = nil
### Execute()方法說明:
* 一共3個返回值,([][]map[string]interface{}, map[string][]map[string]interface{}, error)
* 當以上3個方法的sqls或sqlkeys參數為string或[]string時為有序執行Sql執行單元,故返回結果集為第一個返回值,Slice存儲,第二返回值為nil
* 當以上3個方法的sqls或sqlkeys參數為map[string]string時為無序執行Sql執行單元,返回結果集為第二個返回值,map存儲,第一個返回值為nil
* 當以上3個方法執行中出現錯誤,則第三個返回值有值,前2個返回值均為nil
<a name="SQL"></a>
~~~
//第一種方式,可以從Engine對象輕松進行使用,該方式自動管理事務,注意如果您使用的是mysql,數據庫引擎為innodb事務才有效,myisam引擎是不支持事務的。
engine.Sqls(sqls, parmas...).Execute()
engine.SqlMapsClient(sqlkeys, parmas...).Execute()
engine.SqlTemplatesClient(sqlkeys, parmas...).Execute()
//第2種方式,手動創建Session對象進行調用,該方式需要您手動管理事務
session := engine.NewSession()
defer session.Close()
// add Begin() before any action
tx,err := session.BeginTrans()
_, err = tx.Session().Exec("delete from userinfo where username = ?", user2.Username)
if err != nil {
tx.RollbackTrans()
return
}
//Execuet返回值有3個,分別為slice,map,error類型
results, _, err = tx.Session().Sqls(sqls, parmas...).Execute()
if err != nil {
tx.RollbackTrans()
return
}
_, results, err = tx.Session().SqlMapsClient(sqlkeys, parmas...).Execute()
if err != nil {
tx.RollbackTrans()
return
}
results, _, err = tx.Session().SqlTemplatesClient(sqlkeys, parmas...).Execute()
if err != nil {
tx.RollbackTrans()
return
}
// add Commit() after all actions
err = tx.CommitTrans()
if err != nil {
return
}
//支持兩種返回結果集
//Slice形式類似如下
/*
[
[
{
"id": "6",
"name": "xorm"
},
{
"id": "7",
"name": "xormplus"
},
{
"id": "8",
"name": "ibatis"
}
],
[
{
"LastInsertId": 0,
"RowsAffected": 0
}
],
[
{
"LastInsertId": 0,
"RowsAffected": 0
}
],
[
{
"LastInsertId": 13,
"RowsAffected": 1
}
]
]
*/
//Map形式類似如下
/*
{
"deleteUser": [
{
"LastInsertId": 0,
"RowsAffected": 0
}
],
"insertUser": [
{
"LastInsertId": 11,
"RowsAffected": 1
}
],
"updateUser": [
{
"LastInsertId": 0,
"RowsAffected": 0
}
],
"userList": [
{
"id": "3",
"name": "xorm"
},
{
"id": "4",
"name": "xormplus"
},
]
}
*/
~~~
- 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 工具
- 常見問題
- 感謝支持