beego框架之orm模組——mysql
阿新 • • 發佈:2020-12-16
技術標籤: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是構造查詢語句,不可直接查詢),
然後根據不同查詢方式獲得結果或執行。