匯入必須的 package 之後,我們需要開啟到資料庫的連結,然後建立一個 beego orm 物件(以 MySQL 為例),如下所示 beego orm:
funcmain() { o := orm.NewOrm()}
簡單範例:
packagemainimport ("fmt""github.com/astaxie/beego/orm" _ "github.com/go-sql-driver/mysql"// 匯入資料庫驅動)// Model StructtypeUserstruct { Id int Name string`orm:"size(100)"`}funcinit() {// 設定預設資料庫 orm.RegisterDataBase("default", "mysql", "root:root@/my_db?charset=utf8", 30)// 註冊定義的 model orm.RegisterModel(new(User))//RegisterModel 也可以同時註冊多個 model//orm.RegisterModel(new(User), new(Profile), new(Post))// 建立 table orm.RunSyncdb("default", false, true)}funcmain() { o := orm.NewOrm() user :=User{Name: "slene"}// 插入表 id, err := o.Insert(&user) fmt.Printf("ID: %d, ERR: %v\n", id, err)// 更新表 user.Name ="astaxie" num, err := o.Update(&user) fmt.Printf("NUM: %d, ERR: %v\n", num, err)// 讀取 one u :=User{Id: user.Id} err = o.Read(&u) fmt.Printf("ERR: %v\n", err)// 刪除表 num, err = o.Delete(&u) fmt.Printf("NUM: %d, ERR: %v\n", num, err)}
SetMaxIdleConns
根據資料庫的別名,設定資料庫的最大空閒連線
orm.SetMaxIdleConns("default", 30)
SetMaxOpenConns
根據資料庫的別名,設定資料庫的最大資料庫連線 (go >= 1.2)
orm.SetMaxOpenConns("default", 30)
目前 beego orm 支援列印除錯,你可以透過如下的程式碼實現除錯
orm.Debug =true
接下來我們的例子採用前面的資料庫表 User,現在我們建立相應的 struct
typeUserinfostruct { Uid int`PK`//如果表的主鍵不是 id,那麼需要加上 pk 註釋,明確的說這個欄位是主鍵 Username string Departname string Created time.Time}typeUserstruct { Uid int`PK`//如果表的主鍵不是 id,那麼需要加上 pk 註釋,明確的說這個欄位是主鍵 Name string Profile *Profile`orm:"rel(one)"`// OneToOne relation Post []*Post`orm:"reverse(many)"`// 設定一對多的反向關係}typeProfilestruct { Id int Age int16 User *User`orm:"reverse(one)"`// 設定一對一反向關係(可選)}typePoststruct { Id int Title string User *User`orm:"rel(fk)"` Tags []*Tag`orm:"rel(m2m)"`//設定一對多關係}typeTagstruct { Id int Name string Posts []*Post`orm:"reverse(many)"`}funcinit() {// 需要在 init 中註冊定義的 model orm.RegisterModel(new(Userinfo),new(User), new(Profile), new(Tag))}
o := orm.NewOrm()var user Userqs := o.QueryTable(user) // 回傳 QuerySeterqs.Filter("id", 1) // WHERE id = 1qs.Filter("profile__age", 18) // WHERE profile.age = 18
例子 3,WHERE IN 查詢條件:
qs.Filter("profile__age__in", 18, 20)// WHERE profile.age IN (18, 20)
例子 4,更加複雜的條件:
qs.Filter("profile__age__in", 18, 20).Exclude("profile__lt", 1000)// WHERE profile.age IN (18, 20) AND NOT profile_id < 1000
可以透過如下介面取得多條資料,請看範例
例子 1,根據條件 age>17,取得 20 位置開始的 10 條資料的資料
var allusers []Userqs.Filter("profile__age__gt", 17)// WHERE profile.age > 17
Delete 操作會對反向關係進行操作,此例中 Post 擁有一個到 User 的外來鍵。刪除 User 的時候。如果 on_delete 設定為預設的級聯操作,將刪除對應的 Post
關聯查詢
有些應用卻需要用到連線查詢,所以現在 beego orm 提供了一個簡陋的實現方案:
typePoststruct { Id int`orm:"auto"` Title string`orm:"size(100)"` User *User`orm:"rel(fk)"`}var posts []*Postqs := o.QueryTable("post")num, err := qs.Filter("User__Name", "slene").All(&posts)
上面程式碼中我們看到了一個 struct 關聯查詢
Group By 和 Having
針對有些應用需要用到 group by 的功能,beego orm 也提供了一個簡陋的實現
qs.OrderBy("id", "-profile__age")// ORDER BY id ASC, profile.age DESCqs.OrderBy("-profile__age", "profile")// ORDER BY profile.age DESC, profile_id ASC
上面的程式碼中出現了兩個新介面函式
GroupBy:用來指定進行 groupby 的欄位
Having:用來指定 having 執行的時候的條件
使用原生 sql
簡單範例:
o := orm.NewOrm()var r orm.RawSeterr = o.Raw("UPDATE user SET name = ? WHERE name = ?", "testing", "slene")
複雜原生 sql 使用:
func (m *User) Query(name string) user []User {var o orm.Ormervar rs orm.RawSeter o = orm.NewOrm() rs = o.Raw("SELECT * FROM user "+"WHERE name=? AND uid>10 "+"ORDER BY uid DESC "+"LIMIT 100", name)//var user []User num, err := rs.QueryRows(&user)if err !=nil { fmt.Println(err) } else { fmt.Println(num)//return user }return}