一、初始化一個項目html
二、安裝依賴包mysql
// orm框架 go get github.com/astaxie/beego/orm // 使用什麼數據庫 go get github.com/go-sql-driver/mysql
三、在main.go
中使用init
函數進行鏈接git
import ( ... _ "github.com/go-sql-driver/mysql" // 必須加上 ) func init() { orm.RegisterDriver("mysql", orm.DRMySQL) // default必需要有,表示鏈接的數據庫別名,多是多個 orm.RegisterDataBase("default", "mysql", "用戶名:密碼@tcp(localhost:3306)/數據庫名?charset=utf8mb4&parseTime=True&loc=Local") }
四、建立一個models
的文件夾專門存放數據模型(與數據庫表一一對應的)github
package models import "github.com/astaxie/beego/orm" type User struct { Id int Name string Age int Address string } //自定義表名,能夠不寫的會默認如下劃線來分割駝峯命名的 func (self *User) TableName () string { return "user" } func init() { // 使用exper表達式必需要注入模型,所以咱們強制本身無論什麼都要在模型中使用init函數來注入模型 orm.RegisterModel(new(User)) }
exper
查詢建立句柄的兩種方式一、直接使用表名的方式來建立句柄sql
type UserExper1Controller struct { beego.Controller } func (ctx *UserExper1Controller) Get() { o := orm.NewOrm() // 使用表名的方式來建立一個exper查詢句柄 qs :=o.QueryTable("user") // 查詢後的數據須要放到user這個結構體中 user := models.User{} // 使用expre表達式查詢【name__exact】表示name徹底匹配,One表示查詢一條數據 qs.Filter("name__exact", "孫悟空").One(&user) fmt.Println(user) ctx.TplName="orm.html" }
二、使用數據模型的方式【建議使用數據模型】數據庫
type UserExper1Controller struct { beego.Controller } func (ctx *UserExper1Controller) Get() { o := orm.NewOrm() // 使用數據模型 userModel := new(models.User) qs :=o.QueryTable(userModel) user := models.User{} qs.Filter("name__exact", "孫悟空").One(&user) fmt.Println(user) ctx.TplName="orm.html" }
exper
表達式的操做符號No | 名稱 | 舉例 | 對比原生sql |
---|---|---|---|
1 | exact/iexact |
name__exact (name 字段等於後面的) |
where name = "xx" |
2 | contains/icontains |
name__contains (包含) |
where name like "%xx%" |
3 | gt/gte |
age__gt (大於/大於等於) |
where age > 19 |
4 | lt/lte |
age__lt (小於/小於等於) |
where age < 19 |
5 | startswith/istartswith |
name__startswith (以什麼開頭) |
where name like "x%" |
6 | endswith/iendswith |
name__endswith (以什麼結尾) |
where name like "%x" |
7 | in |
age__in (在什麼範圍裏面) |
where age in (1,2,3) |
8 | isnull |
qs.Filter("gender__isnull",true).One(&user) |
beego
中開啓打印orm
對應的sql
語句的方法一、全局開啓,在main.go
中(推薦使用)json
func main() { orm.Debug = true beego.Run() }
二、在對應的控制器中局部開發數組
func (ctx *UserExper1Controller) Get() { // 開始打印對應的sql orm.Debug = true ... ctx.TplName="orm.html" }
Filter
的使用一、查詢想要的字段markdown
o := orm.NewOrm() // 使用數據模型 userModel := new(models.User) qs := o.QueryTable(userModel) user := models.User{} // 須要查詢出什麼字段就在後面加 qs.Filter("name__exact", "孫悟空").One(&user, "Name","Age") fmt.Println(user) ctx.Data["json"] = user ctx.ServeJSON()
二、多條件查詢數據結構
o := orm.NewOrm() userModel := new(models.User) qs := o.QueryTable(userModel) user := models.User{} // 多條件的時候就多使用Filter qs.Filter("name__exact","孫悟空").Filter("age__gte", 2000).One(&user, "Name","Age") // 匹配的sql // select name, age from user where name = "孫悟空" and age >= 2000; ctx.Data["json"] = user ctx.ServeJSON()
三、使用all
查詢多條語句
o := orm.NewOrm() userModel := new(models.User) qs := o.QueryTable(userModel) //返回多條語句要用切片 user := []models.User{} //不加條件的查詢 qs.All(&user, "Name", "Age", "Address") // select name, age, address from user; ctx.Data["json"] = user ctx.ServeJSON()
四、使用Exclude
排除字段返回
o := orm.NewOrm() userModel := new(models.User) qs := o.QueryTable(userModel) user := []models.User{} qs.Exclude("name__exact", "孫悟空").All(&user) // select * from user where not name = "孫悟空"; ctx.Data["json"] = user ctx.ServeJSON()
五、分頁查詢語句
o := orm.NewOrm() userModel := new(models.User) qs := o.QueryTable(userModel) user := []models.User{} //查詢3條,從第一條開始查詢 qs.Limit(3).Offset(1).All(&user) // select * from user limit 1,3; ctx.Data["json"] = user ctx.ServeJSON()
六、根據字段排序
o :=orm.NewOrm() userModel := new(models.User) qs := o.QueryTable(userModel) user := []models.User{} // 默認是升序,若是要降序的話就直接OrderBy("-age") qs.OrderBy("age").All(&user) ctx.Data["json"] = user ctx.ServeJSON()
七、判斷是否存在
exist := qs.Filter("name__exact","豬八戒").Exist() // 返回true或者false fmt.Println(exist)
八、使用Update
更新操做
o := orm.NewOrm() userModel := new(models.User) num, err := o.QueryTable(userModel).Filter("name__exact", "孫悟空").Update(orm.Params{ "Age": 2000, }) fmt.Println(num) // 受影響的行數 fmt.Println(err) // 錯誤 ctx.Data["json"] = map[string]string{ "code": "0", "message": "成功", } ctx.ServeJSON()
九、刪除語句
o := orm.NewOrm() userModel := new(models.User) num, err := o.QueryTable(userModel).Filter("name__exact","孫悟空").Delete() fmt.Println(num) fmt.Println(err)
十、PrepareInsert
同時插入多條語句
注意最後要關閉
o := orm.NewOrm() users := []models.User{ {Name: "孫悟空",Age: 1000,Address: "花果山"}, {Name: "豬八戒",Age: 800,Address: "高老莊"}, {Name: "沙增",Age: 500,Address: "流沙河"}, } inserter, _ := o.QueryTable(new(models.User)).PrepareInsert() // 循環切片的數據 for _, val := range users { id, err := inserter.Insert(&val) fmt.Println(id) fmt.Println(err) } //注意要記得關閉 inserter.Close() // 可是插入多條數據建議使用InsertMulti o := orm.NewOrm() users := []models.User{ {Name: "郭靖", Age: 30, Address: "襄陽"}, {Name: "黃蓉", Age: 23, Address: "襄陽"}, } num, err := o.InsertMulti(100, &users) fmt.Println(num, err)
十一、values
的使用(真正的json
返回想要的字段)
var maps []orm.Params o := orm.NewOrm() num, err := o.QueryTable(new(models.User)).Filter("age__gte", 100).Values(&maps, "Name", "Id", "Address", "Age") fmt.Println(num, err) ctx.Data["json"] = maps ctx.ServeJSON()
十二、ValuesList
默認返回是1000條數據
var lists []orm.ParamsList o := orm.NewOrm() // 返回數組,裏面嵌套根據字段嵌套 num, err := o.QueryTable(new(models.User)).ValuesList(&lists, "Name") fmt.Println(num, err) ctx.Data["json"] = lists ctx.ServeJSON() // 返回的數據結構 [ [ "唐三藏" ], [ "孫悟空" ] ]
1三、ValuesFlat
扁平化返回一個數組
var lists orm.ParamsList o := orm.NewOrm() // 返回數組,裏面嵌套根據字段嵌套 num, err := o.QueryTable(new(models.User)).ValuesFlat(&lists, "Name") fmt.Println(num, err) ctx.Data["json"] = lists ctx.ServeJSON() // 返回數據 [ "唐三藏", "孫悟空", ]
1四、Update
根據現有字段添加值
o := orm.NewOrm() num, err := o.QueryTable(new(models.User)).Filter("name__exact", "孫悟空").Update(orm.Params{ "Age": orm.ColValue(orm.ColAdd, 100), }) // 對應的原生sql // update user set age=age+100 where name = "孫悟空"; fmt.Println(num, err)
對應別的方法有
ColAdd
添加
ColMinus
減小
ColMultiply
乘法
ColExcept
除法