Go語言學習教程:xorm表基本操做及高級操做

在上節內容中,咱們介紹了xorm框架表結構的映射規則和表結構的操做。本節課,繼續來深刻學習表結構基本操做和高級查詢的相關功能。sql

表結構基本操做

對錶結構的操做最多見的操做是查詢和統計相關的方法,咱們首先來看相關實現:數據庫

  • 條件查詢編程

    • Id值查詢:參數接收主鍵字段的值。例如:bash

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

      以上Id方法的使用,至關於以下sql語句:session

    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語句的功能:ui

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

    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
    }複製代碼
相關文章
相關標籤/搜索