3.2 Beego ORM框架

3.2 ORM框架

Beego中內(nèi)嵌了ORM框架,用來操作數(shù)據(jù)庫。那么ORM框架是什么呢?ORM框架是Object-RelationShip-Mapping的縮寫,中文叫對象關(guān)系映射.

3.2.1 ORM初始化

  • 首先要導(dǎo)包

    import "github.com/astaxie/beego/orm"
    
  • 然后要定義一個結(jié)構(gòu)體

    type User struct{
        Id int
        Name string
        PassWord string
    }
    

    思考:如果表名和字段名為小寫會發(fā)生什么結(jié)果?

    注意觀察數(shù)據(jù)庫表中的字段和結(jié)構(gòu)體中的字段是否一樣?

  • 然后向數(shù)據(jù)庫中注冊表,這一步又分為三步:

    • 連接數(shù)據(jù)庫

      用RegisterDataBase()函數(shù),第一個參數(shù)為數(shù)據(jù)庫別名,也可以理解為數(shù)據(jù)庫的key值,項目中必須有且只能有一個別名為default的連接,第二個參數(shù)是數(shù)據(jù)庫驅(qū)動,這里我們用的是MySQL數(shù)據(jù)庫,所以以MySQL驅(qū)動為例,第三個參數(shù)是連接字符串,和傳統(tǒng)操作數(shù)據(jù)庫連接字符串一樣,格式為:用戶名:密碼@tcp(ip:port)/數(shù)據(jù)庫名稱?編碼方式,代碼如下:

      orm.RegisterDataBase("default","mysql","root:123456@tcp(127.0.0.1:3306)/class1?charset=utf8")
      

      注意:ORM只能操作表,不能操作數(shù)據(jù)庫,所以我們連接的數(shù)據(jù)庫要提前在MySQL終端創(chuàng)建好。

    • 注冊數(shù)據(jù)庫表

      用orm.RegisterModel()函數(shù),參數(shù)是結(jié)構(gòu)體對象,如果有多個表,可以用 ,隔開,多new幾個對象:

      orm.RegisterModel(new(User))
      
    • 生成表

      用orm.RunSyncdb()函數(shù),這個函數(shù)有三個參數(shù),

      第一個參數(shù)是數(shù)據(jù)庫的別名和連接數(shù)據(jù)庫的第一個參數(shù)相對應(yīng)。

      第二個參數(shù)是是否強(qiáng)制更新,一般我們寫的都是false,如果寫true的話,每次項目編譯一次數(shù)據(jù)庫就會被清空一次,fasle的話會在數(shù)據(jù)庫發(fā)生重大改變(比如添加字段)的時候更新數(shù)據(jù)庫。

      第三個參數(shù)是用來說,生成表過程是否可見,如果我們寫成課件,那么生成表的時候執(zhí)行的SQL語句就會在終端看到。反之看不見。代碼如下:

      orm.RunSyncdb("default",false,true)
      

完整代碼如下:

import "github.com/astaxie/beego/orm"

type User struct {
    Id int
    Name string
    Passwd string
}

func init(){
    //1.連接數(shù)據(jù)庫
    orm.RegisterDataBase("default","mysql","root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
    //2.注冊表
    orm.RegisterModel(new(User))
    //3.生成表
    //1.數(shù)據(jù)庫別名
    //2.是否強(qiáng)制更新
    //3.創(chuàng)建表過程是否可見
    orm.RunSyncdb("default",false,true)
}

因為這里我們把ORM初始化的代碼放到了 models包的init()函數(shù)里面,所以如果我們想讓他執(zhí)行的話就需要在main.go里面加入這么一句代碼:

import _ "classOne/models"

3.2.2 簡單的ORM增刪改查操作

在執(zhí)行ORM的操作之前需要先把ORM包導(dǎo)入,但是GoLand會自動幫我們導(dǎo)包,也可以手動導(dǎo)包

import "github.com/astaxie/beego/orm"

插入

  • 先獲取一個ORM對象,用orm.NewOrm()即可獲得

    o := orm.NewOrm()
    
  • 定義一個要插入數(shù)據(jù)庫的結(jié)構(gòu)體對象

    var user User
    
  • 給定義的對象賦值

    user.Name = "zhangsan"
    user.Passwd = "123456"
    

    這里不用給Id賦值,因為建表的時候我們沒有指定主鍵,ORM默認(rèn)會以變量名為Id,類型為int的字段當(dāng)主鍵,至于如何指定主鍵,我們明天詳細(xì)介紹。

  • 執(zhí)行插入操作,o.Insert()插入,參數(shù)是結(jié)構(gòu)體對象,返回值是插入的id和錯誤信息。

    id, err := o.Insert(&user)
    if err == nil {
        fmt.Println(id)
    }
    

查詢

  • 也是要先獲得一個ORM對象

    o := orm.NewOrm()
    
  • 定義一個要獲取數(shù)據(jù)的結(jié)構(gòu)體對象

    var user User
    
  • 給結(jié)構(gòu)體對象賦值,相當(dāng)于給查詢條件賦值

    user.Name = "zhangsan"
    
  • 查詢,用o.Read(),第一個參數(shù)是對象地址,第二個參數(shù)是指定查詢字段,返回值只有錯誤信息。

    err := o.Read(&user,"Name")
    if err != nil{
          beego.Info("查詢數(shù)據(jù)錯誤",err)
          return
      }
    

    如果查詢字段是查詢對象的主鍵的話,可以不用指定查詢字段

更新

  • 一樣的套路,先獲得ORM對象

    o := orm.NewOrm()
    
  • 定義一個要更新的結(jié)構(gòu)體對象

    var user User
    
  • 給結(jié)構(gòu)體對象賦值,相當(dāng)于給查詢條件賦值

    user.Name = "zhangsan"
    
  • 查詢要更新的對象是否存在

    err := o.Read(&user)
    if err != nil{
      beego.Info("查詢數(shù)據(jù)錯誤",err)
      return
    }
    
  • 如果查找到了要更新的對象,就給這個對象賦新值

    user.Passwd = "123456"
    
  • 執(zhí)行更新操作,用o.Update()函數(shù),參數(shù)是結(jié)構(gòu)體對象指針,返回值是更新的條目數(shù)和錯誤信息

    count,err=o.Update(&user)
    if err != nil{
      beego.Info("更新數(shù)據(jù)錯誤",err)
      return
    }
    

刪除

  • 同樣的,獲取ORM對象,獲取要刪除的對象

    o := orm.NewOrm()
    var user User
    
  • 給刪除對象賦值,刪除的對象主鍵必須有值,如果主鍵沒值,就查詢一下。我們這里直接給主鍵賦值。

    user.Id = 1
    
  • 執(zhí)行刪除操作,用的方法是o.Delete(),參數(shù)是刪除的結(jié)構(gòu)體對象,返回值是刪除的條目數(shù)和錯誤信息

    num, err := o.Delete(&User{Id: 1})
    if err == nil {
        fmt.Println(num)
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容