Go語言學習教程:xorm表基本操作及高階操作

qfDavie發表於2019-04-04

在上節內容中,我們介紹了xorm框架表結構的對映規則和表結構的操作。本節課,繼續來深入學習表結構基本操作和高階查詢的相關功能。

表結構基本操作

對錶結構的操作最常見的操作是查詢和統計相關的方法,我們首先來看相關實現:

  • 條件查詢

    • Id值查詢:引數接收主鍵欄位的值。例如:

      var user User
      engine.Id(1).Get(&user)複製程式碼

      以上Id方法的使用,相當於如下sql語句:

    select * from user where id = 1複製程式碼

    如果資料庫表結構是複合主鍵,則在使用Id時進行主鍵分別指定,比如以下案例:

    engine.Id(core.PK(1,"davie").Get(&user)複製程式碼

    以上該句程式碼表示的即是查詢多個複合主鍵的情況,core.PK中傳入的引數順序應該與結構體定義中的主鍵順序一致,否則匹配會出錯。對應的sql語句如下:

    select * from user where id = 1 and name = 'davie'複製程式碼
    • Where條件查詢 Where條件查詢與Sql語句中的where條件查詢功能一致。我們通過案例來檢視Where的使用方法,如下所示:

    engine.Where(" user_name = ? and pwd = ? ", 'davie', '123').Get(&admin)複製程式碼

    如上xorm引擎操作即是如下sql語句的功能:

    select * from admin where user_name = 'davie' and pwd = '123'複製程式碼
    • And條件查詢 And條件查詢功能與Where語句的使用方式類似相同,作為並列條件和約束條件進行結果查詢。使用方式如下:

    engine.Id(1).And(" user_name = ?",'davie").Get(&user)複製程式碼

    以上的And方法並列查詢就相當於如下的sql語句:

    select * from user where id = 1 and user_name = 'davie' 複製程式碼
    • Or條件查詢 Or條件查詢的意思是或者的意思,與程式語言中的 “ || ”功能相同,在查詢時,如果有多個條件使用了Or語句,則對於同一條資料而言,只要符合其中一個條件,就會被查詢出來。具體的使用方法和對應的sql語句如下:

    engine.Id(1).Or("user_name = ?",'davie').Get(&user)複製程式碼

    如上的Or操作語句對應如下sql語句:

    select * from user where id = 1 or user_name = davie複製程式碼
    • Sql條件查詢 除了上述Id、Where、And、Or等方法的使用外,xorm同樣支援執行原生的sql語句,方便更願意使用原生SQL語句的開發者。

    engine.SQL(" select * from user where id = 1 nad user_name = 'davie')複製程式碼
    • 排序條件查詢 在資料庫查詢時,會涉及到查詢結果的排序問題。常規操作支援兩種排序:正排序逆排序。 在xorm中的實現與sql語句中的兩種排序方式基本相同,分別定義為Asc方法和Desc方法。或者使用OrderBy方法對自定義的排序的欄位進行指定。 注意:上述三個方法的引數都是string型別,用於指定表格欄位。

    • In多值範圍查詢 In方法的多值範圍查詢,是用於某個欄位中的條件查詢,該方法需要兩個引數:第一個引數為指定查詢的欄位,第二個引數為欄位多取值內容。我們同樣給出如下案例:

    engine.In('user_name','davie','pony','jack').Find()複製程式碼
    • Cols特定欄位查詢 Cols方法可以接受一個或者多個特點的表欄位名稱,用來表示限定於操作特定的表欄位。依然通過案例來說明:

        engine.Cols("user_name","status").Find(&admins)
        //select user_name, status from admin複製程式碼

      上述Cols操作表示的sql語句就是註釋所對應的sql語句,表示從admin表中,查詢特定的user_name, status兩個欄位,並將查詢後的集合進行返回。

        engine.Cols("user_name","status").Update(&admin)
        //update admin set user_name = admin.User_name  and status = admin.Status複製程式碼

      我們可以看到,除了Find方法外,還可以呼叫Update方法,這裡即表示更新表結構中的某條資料,且僅僅對該條資料的user_name和status兩個欄位進行更新,這正是由Cols方法的引數限定的。

    • AllCols操作所有欄位 除了上述的Cols指定一個或者多個欄位以外,還可以通過AllCols方法來操作表所有欄位,用法與Cols使用方法一致,我們不再贅述。

    • MustCols操作限定欄位 MustCols意為操作必須對某些欄位起作用,該方法的使用和Update方法相結合的情況較多。

增刪改查操作

說了這麼多條件查詢的內容,我們還沒有介紹基本的表記錄的增刪改查操作呢。如下我們一一進行介紹:

  • 增加記錄操作 增加一條記錄可以使用Insert方法完成。該方法接收一個引數,用於傳入實際我們要儲存的資料物件的結構體物件型別。如下所示:

    var user
    ...
    engine.Insert(&user)複製程式碼
  • Delete刪除記錄操作 刪除資料使用Delete方法來進行操作,但是我們在刪除的時候要知道刪除具體哪一條資料,因此在Delete操作前,需要使用我們之前講過的Id操作將資料進行定位查詢出來,我們舉例如下:

      user := new(User)
      count,err := engine.Id(id).Delete(user)複製程式碼

    第一個返回值count表示刪除的記錄數,第二個引數為錯誤返回值,當刪除失敗時,err不為nil。

  • Update修改記錄操作 我們已經講過MustCols的操作是用來限定必須影響某些表欄位的操作的;這裡再次我們強調,我們通常和Update操作放在一起來修改資料,作資料的更新操作。

      admin := new(Admin)
      admin.Status = "1"
      count,err := engine.Id(id).Update(user)複製程式碼

    以上的Update方法是用來更新全部的資料記錄,如果是限定更新某個或者某幾個欄位,可以和Cols結合使用。

  • 查詢記錄操作

    查詢方法有兩個,分為查詢單條資料和查詢多條資料。單條資料的查詢使用Get方法、多條資料的查詢使用Find方法。

Count表結構統計功能

在進行表資料查詢時,我們時長需要統計資料的條數,比如資料一共多少條,用來做分頁處理;再比如統計使用者數量,也需要使用到計數功能。框架提供給我們Count方法來實現資料統計功能,如下是一個簡單的案例:

admin := new(Admin)
count,err := engine.Count(admin)複製程式碼

事務處理

同其他資料庫框架一樣,xorm也是支援事物操作的。在有需要的批量運算元據時,事務的使用往往是必要的。在xorm中,事務操作和Session聯絡在一起。一共三個步驟,分別為:建立session物件,Begin表示事務開始執行,Commit表示提交事務。中間為具體的資料庫操作。

建立事務
session := engine.NewSession()
defer session.Close()複製程式碼
事務開始
err := session.Begin()
//事務相關操作複製程式碼
事務提交
err = session.Commit()
if err != nil{
    panic(err.Error())
}複製程式碼
事務回滾

當在執行事務過程中遇到任何錯誤時,應該及時停止事務,將已經執行的進行回滾。回滾使用的方法是Rollback方法, 只是在執行出現錯誤時進行回滾操作。

...
if err != nil {
    session.Rollback()
    return 
}複製程式碼

中間的事務相關操作,與我們的正常的資料庫操作相同,支援開發者根據自己需求進行多種操作。比如插入資料和更改輸入:

  • 事務插入資料

    admin := Admin{Name: "Davie", Status: "1"}
    _, err = session.Insert(&admin)複製程式碼
  • 事務修改資料

    admin := Admin{ Name:"Davie"}
    count,err := session.Id(2).Update(&admin)
    if err != nil {
        seesion.Rollback()
        return
    }複製程式碼


相關文章