beego框架orm操做exper的操做

1、基本使用

  • 一、初始化一個項目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))
    }

2、使用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"
    }

3、常見的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)

4、在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"
    }

5、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除法

相關文章
相關標籤/搜索