Go語言之高級篇beego框架之model設計構造查詢


一、model設計構造查詢

QueryBuilder 提供了一個簡便,流暢的 SQL 查詢構造器。在不影響代碼可讀性的前提下用來快速的建立 SQL 語句。

QueryBuilder 在功能上與 ORM 重合, 但是各有利弊。ORM 更適用於簡單的 CRUD 操作,而 QueryBuilder 則更適用於復雜的查詢,例如查詢中包含子查詢和多重聯結。

1、model設計構造查詢

示例:

// User 包裝了下面的查詢結果
type User struct {
    Name string
    Age  int
}
var users []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)

 

2、通過構建查詢操作數據庫

示例1:

mysql數據庫

mysql> select * from user_info;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | nulige   | 123456   |
+----+----------+----------+
1 row in set (0.00 sec)

示例:

routers/router.go

package routers

import (
	"web/controllers"

	"github.com/astaxie/beego"
)

func init() {
	beego.Router("/", &controllers.MainController{})
	beego.Router("/test_input", &controllers.TestInputController{}, "get:Get;post:Post")
	beego.Router("/test_model", &controllers.TestModelController{}, "get:Get;post:Post")
} 
controllers/testModel.go
package controllers

import (
	"fmt"

	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
)

//由於model這個名字叫 UserInfo 那么操作的表其實 user_info
type UserInfo struct {
	Id       int64
	Username string
	Password string
}

type TestModelController struct {
	beego.Controller
}

func (c *TestModelController) Get() {
	orm.Debug = true // 是否開啟調試模式 調試模式下會打印出sql語句
	orm.RegisterDataBase("default", "mysql", "root:qwe!23@tcp(127.0.0.1:3306)/test?charset=utf8", 30)
	orm.RegisterModel(new(UserInfo))

	o := orm.NewOrm()

	//構建查詢
	//采用QueryBuilder方式
	var users []UserInfo
	qb, _ := orm.NewQueryBuilder("mysql")
	qb.Select("password").From("user_info").Where("username= ?").Limit(1)

	sql := qb.String()
	o.Raw(sql, "nulige").QueryRows(&users)

	c.Ctx.WriteString(fmt.Sprintf("user info:%v", users))
}

執行結果:

http://127.0.0.1:8080/test_model

返回結果:

user info:[{0  123456}] 

 

3、完整的API接口

type QueryBuilder interface {
    Select(fields ...string) QueryBuilder
    From(tables ...string) QueryBuilder
    InnerJoin(table string) QueryBuilder
    LeftJoin(table string) QueryBuilder
    RightJoin(table string) QueryBuilder
    On(cond string) QueryBuilder
    Where(cond string) QueryBuilder
    And(cond string) QueryBuilder
    Or(cond string) QueryBuilder
    In(vals ...string) QueryBuilder
    OrderBy(fields ...string) QueryBuilder
    Asc() QueryBuilder
    Desc() QueryBuilder
    Limit(limit int) QueryBuilder
    Offset(offset int) QueryBuilder
    GroupBy(fields ...string) QueryBuilder
    Having(cond string) QueryBuilder
    Subquery(sub string, alias string) string
    String() string
}

  

 示例:

示例1:

mysql數據庫

mysql> select * from user_info;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | nulige   | 123456   |
+----+----------+----------+
1 row in set (0.00 sec)

示例:

routers/router.go

package routers

import (
	"web/controllers"

	"github.com/astaxie/beego"
)

func init() {
	beego.Router("/", &controllers.MainController{})
	beego.Router("/test_input", &controllers.TestInputController{}, "get:Get;post:Post")
	beego.Router("/test_model", &controllers.TestModelController{}, "get:Get;post:Post")
} 
controllers/testModel.go
package controllers

import (
	"fmt"

	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	_ "github.com/go-sql-driver/mysql"
)

//由於model這個名字叫 UserInfo 那么操作的表其實 user_info
type UserInfo struct {
	Id       int64
	Username string
	Password string
}

type TestModelController struct {
	beego.Controller
}

func (c *TestModelController) Get() {
	orm.Debug = true // 是否開啟調試模式 調試模式下會打印出sql語句
	orm.RegisterDataBase("default", "mysql", "root:qwe!23@tcp(127.0.0.1:3306)/test?charset=utf8", 30)
	orm.RegisterModel(new(UserInfo))

	o := orm.NewOrm()

	var users []UserInfo
	qb, _ := orm.NewQueryBuilder("mysql")
	qb.Select("password").From("user_info").Where("username= 'nulige'").And("id=1").Limit(1)

	sql := qb.String()
	o.Raw(sql).QueryRows(&users)
	c.Ctx.WriteString(fmt.Sprintf("user info:%v", users))
}

執行結果:

http://127.0.0.1:8080/test_model

返回結果:

user info:[{0  123456}] 




 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM