1. 程式人生 > 其它 >beego框架之orm模組——mysql

beego框架之orm模組——mysql

技術標籤:GO

參考beego原文:http://beego.me/docs/mvc/model/orm.md#main.go

  beego ORM 是一個強大的 Go 語言 ORM 框架,orm模組主要是處理MVC中的M(models)。

  首先以bee工具建立一工程名為:beegoorm,修改的檔案為 beegoorm/main.go 和 beegoorm/models/models.go(僅2個檔案)

beegoorm/models/models.go

package models

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

type User struct {
    Id          int
    Name    string
    Profile *Profile `orm:"rel(one)"` // OneToOne relation
}

type Profile struct {
    Id     int
    Age  int16
    User *User `orm:"reverse(one)"` // 設定反向關係(可選)
}

func init() {
    // 需要在 init 中註冊定義的 model
    orm.RegisterModel(new(User), new(Profile))
}

beegoorm/main.go

package main

import (
    "beegoorm/models"
    "fmt"
    "github.com/astaxie/beego"
    "github.com/astaxie/beego/orm"

    _ "beegoorm/routers"
    _ "github.com/go-sql-driver/mysql"
)

func init() {
    // 註冊驅動
    orm.RegisterDriver("mysql", orm.DR_MySQL)
    // 註冊預設資料庫
    // 我的mysql的root使用者密碼為tom,打算把資料表建立在名為test資料庫裡
    // 備註:此處第一個引數必須設定為“default”(因為我現在只有一個數據庫),否則編譯報錯說:必須有一個註冊DB的別名為 default
    orm.RegisterDataBase("default", "mysql", "root:
[email protected]
/test?charset=utf8") } func main() { // 開啟 orm 除錯模式:開發過程中建議開啟,release時需要關閉 orm.Debug = true // 自動建表 orm.RunSyncdb("default", false, true) // 建立一個 ormer 物件 o := orm.NewOrm() o.Using("default") perfile := new(models.Profile) perfile.Age = 30 user := new(models.User) user.Name = "tom" user.Profile = perfile // insert o.Insert(perfile) o.Insert(user) o.Insert(perfile) o.Insert(user) o.Insert(perfile) o.Insert(user) // update user.Name = "hezhixiong" num, err := o.Update(user) fmt.Printf("NUM: %d, ERR: %v\n", num, err) // delete o.Delete(&models.User{Id: 2}) beego.Run() }

資料庫建表及資料增刪改的結果如下:
資料庫名:test
資料表:user,profile

在models模組裡,被註冊的struct與資料庫裡的表會以一種預設方式進行一一對應。然而,在實際開發中,預設的這種對映關係並不是我們所期待的,所以我們需要指定被註冊的struct與資料庫裡的表之間的關係。

type User struct{    // 預設情況對應資料庫的表名為:user
   MyName  string    // 預設情況對應資料庫裡user表字段為:my_name
   MyAge   string    // 預設情況對應資料庫裡user表字段為:my_age
}
orm.RegisterModel(new(User))

新的需求:結構體名為User對應資料庫的表名為:test_user
        MyName的成員對應資料庫的欄位名為:MyName
         MyAge的成員對應資料庫的欄位名為:MyAge
那麼該User的結構體又該如何定義呢?

新需求的User結構體:
type User struct{
   MyName  string `orm:"column(MyName)"`
   MyAge   string `orm:"column(MySex)"`
}
orm.RegisterModel(new(User))

// 自定義表名(系統自動呼叫)
func (u *User) TableName() string {
    return "test_user"
}

ORM 是對 sql 操作的封裝,定義操作型別如下:

1、已知主鍵情況下,針對物件的 CRUD 的簡單操作;https://beego.me/docs/mvc/model/object.md

o:=orm.NewOrm()
user:=new(User)
user.Name="slene"
fmt.Println(o.Insert(user))
user.Name="Your"
fmt.Println(o.Update(user))
fmt.Println(o.Read(user))
fmt.Println(o.Delete(user))
2、高階查詢:先獲得 QuerySeter 然後進行更多操作:https://beego.me/docs/mvc/model/query.md
需要建立模型,且在使用 where 的時候,需要使用特定的條件符號(有學習成本)
o:=orm.NewOrm()
//獲取QuerySeter物件,user為表名
qs:=o.QueryTable("user")
//也可以直接使用物件作為表名
user:=new(User)
qs=o.QueryTable(user)//返回QuerySeter

3、原生 SQL 查詢:https://beego.me/docs/mvc/model/rawsql.md
直接獲得 RawSeter (然後操作),無需使用 ORM 表定義,直接使用原始 sql 編寫(無需單獨編寫 where),相當於通過安全的 sql 操作表。
o:=orm.NewOrm()
varrRawSeter
r=o.Raw("UPDATEuserSETname=?WHEREname=?","testing","slene")

4、構造查詢:https://beego.me/docs/mvc/model/querybuilder.md
可以構造更復雜的查詢語句,通過 QueryBuilder 構建查詢語句。
當直接使用 o.Raw() 無法滿足需求的情況下用這個來構造查詢語句。
最後還得通過 o.Raw(QueryBuilder) 獲得 RawSeter 後,再操作獲得結果。
//User包裝了下面的查詢結果
typeUserstruct{
Namestring
Ageint
}
varusers[]User
//獲取QueryBuilder物件.需要指定資料庫驅動引數。
//第二個返回值是錯誤物件,在這裡略過
qb,_:=orm.NewQueryBuilder("mysql")

//構建查詢物件
qb.Select("user.name",
"profile.age").
From("user").
InnerJoin("profile").On("user.id_user=profile.fk_user").
Where("age>?").
OrderBy("name").Desc().
Limit(10).Offset(0)

//匯出SQL語句
sql:=qb.String()
//執行SQL語句
o:=orm.NewOrm()
o.Raw(sql,20).QueryRows(&users)

5、事務處理:https://beego.me/docs/mvc/model/transaction.md,使用簡單

o:=NewOrm()
err:=o.Begin()
//事務處理過程
...
...
//此過程中的所有使用oOrmer物件的查詢都在事務處理範圍內
ifSomeError{
err=o.Rollback()
}else{
err=o.Commit()
}

總結:所有操作都必須基於 orm.NewOrm() 獲得一個連線,然後在連線裡面來設定使用方式:QuerySeter 或 RawSeter (QueryBuilder是構造查詢語句,不可直接查詢),
然後根據不同查詢方式獲得結果或執行。